From 5a2e95485ed2fd9fe109f8d8eddbe74f894c1204 Mon Sep 17 00:00:00 2001 From: KINDNICK Date: Sun, 9 Aug 2026 05:10:35 +0900 Subject: [PATCH] release: camera AI 0.4.9 worker 0.1.5 --- CameraAI~/CHANGELOG.md | 27 + .../Documentation~/EXTERNAL_INSTALLATION.md | 4 +- CameraAI~/README.md | 11 +- .../Tools~/CWCameraWorker/CWCameraWorker.exe | 4 +- .../_cffi_backend.cp312-win_amd64.pyd | 2 +- .../CWCameraWorker/_internal/_elementtree.pyd | 3 + ...cb5d92a588d1b93__mypyc.cp312-win_amd64.pyd | 3 - .../CWCameraWorker/_internal/base_library.zip | Bin 1333490 -> 1333490 bytes .../_internal/certifi/cacert.pem | 1691 +++++++++++++---- .../charset_normalizer/cd.cp312-win_amd64.pyd | 3 - .../charset_normalizer/md.cp312-win_amd64.pyd | 2 +- .../md__mypyc.cp312-win_amd64.pyd | 3 + .../cw_camera_worker_build_identity.json | 20 +- .../build_hybrid_preparation_cache.py | 7 +- .../CameraDirector/camera_kinematics.py | 328 +++- .../CameraDirector/cw_camera_runtime.py | 2 +- .../CameraDirector/data_driven_cut_planner.py | 135 +- .../CameraDirector/generate_hybrid.py | 1463 +++++++++++++- .../CameraDirector/trajectory_quality.py | 122 +- ...cp140-8f141b4454fa78db34bc1f28c571b4da.dll | 3 - .../_internal/llvmlite/binding/llvmlite.dll | 4 +- .../msgpack/_cmsgpack.cp312-win_amd64.pyd | 4 +- .../numba/_devicearray.cp312-win_amd64.pyd | 4 +- .../numba/_dispatcher.cp312-win_amd64.pyd | 4 +- .../numba/_dynfunc.cp312-win_amd64.pyd | 4 +- .../numba/_helperlib.cp312-win_amd64.pyd | 4 +- .../runtime/_nrt_python.cp312-win_amd64.pyd | 2 +- .../typeconv/_typeconv.cp312-win_amd64.pyd | 4 +- .../cuda/cudadrv/_extras.cp312-win_amd64.pyd | 2 +- .../jitclass/_box.cp312-win_amd64.pyd | 2 +- .../numba/mviewbuf.cp312-win_amd64.pyd | 2 +- .../np/ufunc/_internal.cp312-win_amd64.pyd | 2 +- .../np/ufunc/omppool.cp312-win_amd64.pyd | 4 +- .../np/ufunc/tbbpool.cp312-win_amd64.pyd | 4 +- .../np/ufunc/workqueue.cp312-win_amd64.pyd | 4 +- .../INSTALLER | 1 + .../LICENSE | 202 ++ .../METADATA | 129 ++ .../importlib_metadata-8.0.0.dist-info/RECORD | 32 + .../REQUESTED | 0 .../importlib_metadata-8.0.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../_internal/soxr/soxr_ext.pyd | 4 +- .../wheel-0.45.1.dist-info/INSTALLER | 1 + .../wheel-0.45.1.dist-info/LICENSE.txt | 21 + .../_internal/wheel-0.45.1.dist-info/METADATA | 66 + .../_internal/wheel-0.45.1.dist-info/RECORD | 68 + .../wheel-0.45.1.dist-info/REQUESTED | 0 .../_internal/wheel-0.45.1.dist-info/WHEEL | 4 + .../wheel-0.45.1.dist-info/entry_points.txt | 6 + ...w_camera_worker_distribution_manifest.json | 78 + CameraAI~/package.json | 2 +- README.md | 14 +- 53 files changed, 3933 insertions(+), 584 deletions(-) create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/_elementtree.pyd delete mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/ada92cb5d92a588d1b93__mypyc.cp312-win_amd64.pyd delete mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/cd.cp312-win_amd64.pyd create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md__mypyc.cp312-win_amd64.pyd delete mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite.libs/msvcp140-8f141b4454fa78db34bc1f28c571b4da.dll create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/INSTALLER create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/LICENSE.txt create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/METADATA create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/REQUESTED create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/WHEEL create mode 100644 CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/entry_points.txt create mode 100644 CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json diff --git a/CameraAI~/CHANGELOG.md b/CameraAI~/CHANGELOG.md index 7caad90..dab6e73 100644 --- a/CameraAI~/CHANGELOG.md +++ b/CameraAI~/CHANGELOG.md @@ -1,5 +1,32 @@ # Changelog +## 0.4.9 - 2026-08-09 + +- Restored the authored same-audio cut prior for production generation inputs + without admitting the target camera trajectory into the planner or template + library. The Arisa regression song now recovers its music-shaped 69-shot + cadence, while a silent-tail fallback cut is removed. +- Replaced performer-screen-motion penalties with stabilized residual framing + diagnostics so expressive dance motion no longer suppresses orbit, drift, + lead-room, or authored camera movement. Hard person, distance, step, aim, and + dynamics gates remain fail-closed. +- Calibrated front-facing safety once over the full performance. Choreography + turns can keep a stable stage-front camera without rewarding side or rear + placement, while true 180-degree rear candidates remain rejected. +- Added a versioned selection-safety contract for selected-shot regeneration, + verified exact-audio reference hashes across bundled and project data roots, + and deterministically deduplicated identical packaged reference copies. +- Added a final-world post-clamp kinematic repair and hard audit. Distance + clamping can no longer reintroduce an unbraked reversal after the YAMO + deceleration/acceleration pass; all 69 regression shots pass the final + post-clamp contract and Shot 66 has zero remaining abrupt reversal events. +- Rebuilt the self-contained Windows worker as 0.1.5 with Python 3.12.13 in a + disposable, exact-pinned environment with one-thread scientific-library + limits, artifact size/file-count guards, and a distribution provenance + manifest. The clean worker contains 647 files (267,608,825 bytes), passes + `doctor`, and is byte-identical to source generation for camera, time, and + shot outputs. + ## 0.4.8 - 2026-08-09 - Replaced the unstable frame-local aim controller with a causal, feed-forward diff --git a/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md b/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md index 1a33f1d..2a55053 100644 --- a/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md +++ b/CameraAI~/Documentation~/EXTERNAL_INSTALLATION.md @@ -17,7 +17,7 @@ must remain together. In Unity Package Manager, choose **Add package from git URL** and enter: ```text -https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.7 +https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.15 ``` The initial package download is large because the frozen Windows worker is @@ -26,7 +26,7 @@ it, remove the package lock entry, and add the package again. ## Reference data -Version 0.1.7 includes a compact, read-only `RuntimeData~` bundle with the +Version 0.1.15 includes a compact, read-only `RuntimeData~` bundle with the 263 prepared reference songs, cut policy, and ranker model. An artist workstation does not need a separate `CW-AI` checkout or Python installation. If a newer access-controlled library is available, it remains an optional diff --git a/CameraAI~/README.md b/CameraAI~/README.md index 06ae503..f97c69f 100644 --- a/CameraAI~/README.md +++ b/CameraAI~/README.md @@ -16,7 +16,7 @@ Cinemachine Track이나 기존 카메라 애니메이션은 필요하지 않으 Unity Package Manager의 `Add package from git URL`에는 다음 주소를 사용할 수 있습니다. -`https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.7` +`https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.15` 배포 패키지에는 Windows x64용 `CWCameraWorker` 폴더 전체가 포함됩니다. Python은 따로 설치하지 않아도 되지만, Git 패키지의 대용량 바이너리를 받으려면 @@ -24,10 +24,11 @@ Unity를 열기 전에 Git과 Git LFS를 설치해야 합니다. Worker는 단 아니므로 `CWCameraWorker.exe`와 같은 폴더의 `_internal` 내용을 함께 유지해야 합니다. -카메라 생성에 필요한 사내 참조 카메라·모션 데이터는 권한이 있는 `CW-AI` -데이터 루트에서 읽습니다. 해당 데이터는 이 유틸리티 패키지에 포함되지 않습니다. -다른 PC에서는 `CWAI_ROOT` 환경 변수, Unity 프로젝트 옆의 `CW-AI` 폴더 또는 -생성 창의 `고급 · 진단 > 참조 데이터 루트` 중 하나로 위치를 지정합니다. +카메라 생성에 필요한 준비된 참조 카메라·모션 데이터와 컷 모델은 패키지의 +읽기 전용 `RuntimeData~`에 포함됩니다. 별도의 `CW-AI` 체크아웃은 필요하지 +않습니다. 더 최신의 권한 제어 데이터가 있다면 `CWAI_ROOT` 환경 변수, Unity +프로젝트 옆의 `CW-AI` 폴더 또는 생성 창의 +`고급 · 진단 > 참조 데이터 루트`에서 선택적으로 덮어쓸 수 있습니다. 상세 설치 절차는 `Documentation~/EXTERNAL_INSTALLATION.md`를 참고하세요. 참조 데이터는 읽기 전용이어도 됩니다. 반복 생성 캐시는 기본적으로 현재 Unity 프로젝트의 `Library/CWAI`에 저장되며, 필요하면 `CWAI_CACHE_ROOT` 환경 변수로 diff --git a/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe b/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe index dde6425..4f4f85a 100644 --- a/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe +++ b/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c6a6c7ec20624b98a9b705bf2c7625ac8d318c1e67bce4a21ee3a741cd648b1 -size 16427637 +oid sha256:055fb16b60454b0d131ed2201eccad8d11977bd99ef011468d44638b33e4a1ef +size 16752516 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/_cffi_backend.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/_cffi_backend.cp312-win_amd64.pyd index 150b157..c87d4d8 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/_cffi_backend.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/_cffi_backend.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9af5e4f68a41f26b726f2e9424f9d58a4f5666189f6a48be95f406b257102aec +oid sha256:53de34afc3939d81bf2498b77425c52e2c3f3164f8cfe2543d3acc8f24134488 size 181248 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/_elementtree.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/_elementtree.pyd new file mode 100644 index 0000000..22d02a2 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/_elementtree.pyd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46dabdeec004a4a94a1a65169f2867a2ce648555101301716d630b792b7f1650 +size 121856 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/ada92cb5d92a588d1b93__mypyc.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/ada92cb5d92a588d1b93__mypyc.cp312-win_amd64.pyd deleted file mode 100644 index c390420..0000000 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/ada92cb5d92a588d1b93__mypyc.cp312-win_amd64.pyd +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df5ea1b515f4e6677196f3d8c2f40a00b008d8e09152d08425f794e1b55f890d -size 227328 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/base_library.zip b/CameraAI~/Tools~/CWCameraWorker/_internal/base_library.zip index e8496f9d7f9049dfe94a958f447891cf2505d622..65446cfaf370bb06abbabf968d6ccbf460480481 100644 GIT binary patch delta 2145 zcmY+F3vg8B6~}k?W*_(7y}S1=Ur4ec52ytuA|Xqjn`Ac+HV=|WqL75qCO}+BN}7aZ zQ$*yERt2Lxgz8`8C`Ad65mW@dOh;-2N|Z-BHAqCQN{14L78Pu!T4mDnWp}1@XTF)= z|J?JP?|kQ+d-vAinp=l!^i^xLwnubFn{nzdbh$;9aO(C1by~9isBAeA&~t`O z)1&m`n$WXXFDy65F4w>OPJ8;Oettwa;nqW^&9;EvIAUt>>M>)&!8m<(zS{rtrjw2+ z{iMUZ-m4E@H+Ej@ar8TkZTje8^A?7)9;WIaoi~n6(S65+ZAtKEkfG%b^Lmq>Eos9g z`tWCJaJIhfmay5h$yZ~cWu;}KCDM{;$+YaW6x~F8z* z)iJkVFc|QUIyMFOc}OjJ#DI1WO90(djizT4zm3M85rd&K*wNYAvJ6HKV`!`;@3C4|GP&mp# zvWnv^CPP#EL%}BO_OfW0Xt%IY6_Av{;$f{P_57~|+*Qwhj<|GEcikO@%ygEFL)`Of zAPQ$PDC2I5W&64}$`D%95e$c-VynvkE>ZcXD7>D|5^0}%N523Y#2*pUd!|kxDP(8rA${--nK0c(a;rI8VVPJ+U=IzKNG1C9cwy+E5g<* zbR{9FK!lN(kS4$_yxu6HE`u)LK+O~LmWhVu;L?s&VgISTq0R#$e0AheOV_c7M(CK% zU}MM9&Mu_o(w(MdlG9I@MEEmVu`qgF#N(N)P`Kx|i1i^$EX*`{xXGP{Vk9`SsJ-_l zOIW~R=S&IPvsjTZFh_#6pS*8mu@vD(wgh)J^9z&eBs`c+&tGelu$x11vxKYs(S;`@ z%*!cW^JRN1Vt=*^+6u`f!{b6A0JZl8pNBx?d4hvgZWgg!DbnX zkIfURx@EllPfDiMM?3!5Bg6RvsfpT^n{9UvjdiPxFMJg4sXiH>Yqt2X*8_?F=M}e) zQt;Cer$3c()KB>iUy<=|KjoWyQ$|h!!5?nRSj*vS(GGu)Ejk?OZv|AHwUg}_FQ67J zNwnkev$j~&7gA>Lrc9_wNPfj;#!KAf&x)A-TF6p`SBoQRS`n#P)e*IQklb5~$oI?ug1PCbg$0qSh9(If89#M7__|FZ&{DNE0nk=276wdn2Z*dE`)X zB%*e5Wf_R5OI$Udi>Rak9dqgvJ8A+{spDVSaXG*y<4}O52`8^jsDNDB&$1arL2XLPaC4l+6}Ss0!wn(lqSOQqWsUFYh|Pf}wZBSbSAV`Mz4I zKq+HI+GF(!eIe+J)zY@2D|N-PmEo7Ke?(MKQO+cxX^Dbo%J`%;D;O@LUS@VEm|RYl z#D^8MeIZlaT!+bKI+NIzi zHy_xi;0A~BBMPeTrspM<^p?1@r90>DlL0!ag1p}Tmx4DrG^aRllf(K32RxMo$9Fi; z#o^DV9Z2@c3?Ed|Nkcz6FviVSQk}@GBDmb-#A*)S=bSjk;rgHxKXB-|;Dq;H0=uMQ zEr$l5ig!7D+@az&hnRj9z6As)KUJ}T!@5xw0~{`Xr@~lG@a+r@g}W4n+G1I`Fu+$LjU#y{w!<6M3dO7Uv)NqbN!UheF`v`VDrJf+-IT{yakc0JbM!q_6(6~E1e>{>PhPxC+5GyN_c@UUs1 MzhD)M>)8wc1#`HQzW@LL delta 2195 zcmY+F4Nz3q6~}k?E&KMp-S^mq3xP!zw2dgX2rRpNe}4<9t|>y())narO59Z-p>-OO zq$x?J#KcMZPe$s;j7Ae}kSKYOX~vjT)0Q!fbu30}ftgexlhm)OG^yBgVP{Hr=Fa^7 z=bU@bx#!+}_tt>-)_}LCcb};B?lY@_S*|f=n5ziR3CEt?5;!Z!p`p?Ur(x6N zOZHDjFp|b>&qnG8BMlLWnrX~bKB zX3_YF970Q?9^-D7BfOrZN4$q6q9KhrEV_VR*V)(>*cfPrJ%dH@wmF1_BYGq?utlKG z*%V4Q``e*EaaNC)JZu4|m-FqzU+8f?gTm7fZ9892IoU{(!%2V-uV%7K2@xv_khS0sWb@K{^rJ zL;ovAx+CZw-x%;WH8!>QvERiQ`Y4fkP&MlOfhRW4nPw=h;HnNooQvw4poBtAe;8(X z2l7doKN|?swRbdj@bDDNhBINh;1+*dV@D8aZt4e}?EIYuEG7igshG38v{bJNUu3dU zA#S}1sadR8XzVbdBa4*?hMgu1XR!j|X_)XehmZG~aBPVjgM)N$(3DN{|8>ZO9oZDU z@R$jwvss}~`3WslPeBPeELj-)s|mF^Ja&7lU(kX=NGR}5^+73RSJgXBC_*n-ffSF?Rm6rU6qIr@>q@V>S_^c zJ}VbIJ`o9%@Bla>q45)d}dZK6c@4-Vd^g;+6t*{-;9YEDx~1HEga&e@eE_@6nC@p@`B_wp?g`JEVe{6yIA)X-3}* zna=WnbsvXRL>Z~~&xce!SFz(E)yLJ(zYM7ft}af`s#tudoYu?>lXzJSo6E_!#~xD0 zxr%az)W5mfmK;)r6{K=9C2Xyrmh_c|%p(=l-|3YSCN5fI;c?SV8yWw<4c@Gubw=W= zajOhpC8fXT3z_y-vUK5Yb4XpQWNzU>Fr?C}$T!m&Qroz?-xX3HR6-!ONQeSf~i&+KjhH2Uq&B?cP_}d!r`W5f%AI=LV*Q74u*CM z_Hl?gWWfZ7sLK{CT1gO4tZ3rkEVSYPhrt>v{=uQB+ls}j2zCux(ab@bwBj&_ngt4` zINb9p7{6p=DDYCf18WtuddV!eDmcpF+j|v!#bNgm1u3fuu4)Q`tEnC9ey?DF!{0tt zaGS%bD+=6?5?q>6(82GXp^KWSP&wl?IoaB*`WxKA$-?(M#+!L~kFMfZO9sOza^d)e$^=EeE ZapmD}+_~F!JnCW(gC1+T#|`ZD{{qJqrvCr{ diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/certifi/cacert.pem b/CameraAI~/Tools~/CWCameraWorker/_internal/certifi/cacert.pem index 9a40f43..f2d6601 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/certifi/cacert.pem +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/certifi/cacert.pem @@ -1,4 +1,613 @@ +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + # Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Label: "COMODO ECC Certification Authority" @@ -23,6 +632,105 @@ fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + # Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) # Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) # Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" @@ -252,6 +960,122 @@ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn sSi6 -----END CERTIFICATE----- +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + # Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority # Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority # Label: "Certum Trusted Network CA" @@ -686,6 +1510,44 @@ aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy KwbQBM0= -----END CERTIFICATE----- +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + # Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Label: "T-TeleSec GlobalRoot Class 2" @@ -717,6 +1579,35 @@ g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN BSeOE6Fuwg== -----END CERTIFICATE----- +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + # Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited # Label: "QuoVadis Root CA 1 G3" @@ -1188,6 +2079,65 @@ GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv 8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + # Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority # Subject: CN=CFCA EV ROOT O=China Financial Certification Authority # Label: "CFCA EV ROOT" @@ -2247,6 +3197,96 @@ PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE QRBdJ3NghVdJIgc= -----END CERTIFICATE----- +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + # Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. # Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. # Label: "NAVER Global Root Certification Authority" @@ -2372,6 +3412,46 @@ DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + # Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Label: "ANF Secure Server Root CA" @@ -2807,6 +3887,45 @@ Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c -----END CERTIFICATE----- +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + # Issuer: CN=GTS Root R3 O=Google Trust Services LLC # Subject: CN=GTS Root R3 O=Google Trust Services LLC # Label: "GTS Root R3" @@ -3395,6 +4514,128 @@ UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj /bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== -----END CERTIFICATE----- +# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Label: "CommScope Public Trust ECC Root-01" +# Serial: 385011430473757362783587124273108818652468453534 +# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16 +# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d +# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa +Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C +flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE +hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq +hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg +2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS +Um9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Label: "CommScope Public Trust ECC Root-02" +# Serial: 234015080301808452132356021271193974922492992893 +# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2 +# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5 +# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa +Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL +j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU +v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq +hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n +ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV +mkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Label: "CommScope Public Trust RSA Root-01" +# Serial: 354030733275608256394402989253558293562031411421 +# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8 +# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93 +# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 +NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk +YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh +suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al +DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj +WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl +P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 +KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p +UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ +kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO +Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB +Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U +CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ +KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ +nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ +QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v +trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a +aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD +j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 +Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w +lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn +YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc +icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Label: "CommScope Public Trust RSA Root-02" +# Serial: 480062499834624527752716769107743131258796508494 +# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa +# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae +# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 +NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE +NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 +kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C +rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz +hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 +LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs +n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku +FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 +kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 +wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v +wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs +5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ +KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 ++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme +APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq +pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT +6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF +sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt +PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d +lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 +v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O +rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + # Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH # Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH # Label: "Telekom Security TLS ECC Root 2020" @@ -3459,6 +4700,30 @@ ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= -----END CERTIFICATE----- +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + # Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA # Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA # Label: "TWCA CYBER Root CA" @@ -3499,6 +4764,35 @@ xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X -----END CERTIFICATE----- +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + # Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. # Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. # Label: "SecureSign Root CA14" @@ -3560,400 +4854,3 @@ Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT 4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= -----END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 2 2023" -# Serial: 153168538924886464690566649552453098598 -# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 -# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 -# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw -OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr -i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE -gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 -k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT -Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl -2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U -cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP -/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS -uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ -0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N -DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ -XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 -GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI -FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n -riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR -VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc -LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn -4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD -hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG -koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 -ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS -Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 -knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ -hJ65bvspmZDogNOfJA== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS ECC Root CA" -# Serial: 310892014698942880364840003424242768478804666567 -# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c -# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 -# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 ------BEGIN CERTIFICATE----- -MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw -WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw -NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE -ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB -c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ -AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp -guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw -DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 -L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR -OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS RSA Root CA" -# Serial: 160405846464868906657516898462547310235378010780 -# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 -# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa -# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 ------BEGIN CERTIFICATE----- -MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM -BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN -MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG -A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 -c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC -AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ -NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ -Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 -HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 -ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb -xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX -i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ -UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j -TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT -bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 -S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 -Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 -iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt -7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp -2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ -g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj -pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M -pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP -XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe -SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 -ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy -323imttUQ/hHWKNddBWcwauwxzQ= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 2 2023" -# Serial: 139766439402180512324132425437959641711 -# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 -# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b -# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw -OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK -F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE -7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe -EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 -lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb -RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV -jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc -jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx -TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ -ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk -hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF -NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH -kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 -QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 -pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q -3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU -t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX -cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 -ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT -2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs -7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP -gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst -Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh -XBxvWHZks/wCuPWdCg== ------END CERTIFICATE----- - -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Label: "SwissSign RSA TLS Root CA 2022 - 1" -# Serial: 388078645722908516278762308316089881486363258315 -# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 -# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce -# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 ------BEGIN CERTIFICATE----- -MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE -AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx -MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT -d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg -MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX -vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 -LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX -5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE -EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt -/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x -0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 -KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM -0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd -OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta -clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK -wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 -DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL -BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 -10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz -Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ -iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc -gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM -ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF -LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp -zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td -Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 -rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO -gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Label: "OISTE Server Root ECC G1" -# Serial: 47819833811561661340092227008453318557 -# MD5 Fingerprint: 42:a7:d2:35:ae:02:92:db:19:76:08:de:2f:05:b4:d4 -# SHA1 Fingerprint: 3b:f6:8b:09:ae:2a:92:7b:ba:e3:8d:3f:11:95:d9:e6:44:0c:45:e2 -# SHA256 Fingerprint: ee:c9:97:c0:c3:0f:21:6f:7e:3b:8b:30:7d:2b:ae:42:41:2d:75:3f:c8:21:9d:af:d1:52:0b:25:72:85:0f:49 ------BEGIN CERTIFICATE----- -MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQsw -CQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwY -T0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUy -NDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRp -b24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBHMTB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOujvqQy -cvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N -2xml4z+cKrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3 -TYhlz/w9itWj8UnATgwQb0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9C -tJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCpKjAd0MKfkFFR -QD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxgZzFDJe0CMQCSia7pXGKD -YmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Label: "OISTE Server Root RSA G1" -# Serial: 113845518112613905024960613408179309848 -# MD5 Fingerprint: 23:a7:9e:d4:70:b8:b9:14:57:41:8a:7e:44:59:e2:68 -# SHA1 Fingerprint: f7:00:34:25:94:88:68:31:e4:34:87:3f:70:fe:86:b3:86:9f:f0:6e -# SHA256 Fingerprint: 9a:e3:62:32:a5:18:9f:fd:db:35:3d:fd:26:52:0c:01:53:95:d2:27:77:da:c5:9d:b5:7b:98:c0:89:a6:51:e6 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBL -MQswCQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UE -AwwYT0lTVEUgU2VydmVyIFJvb3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4 -MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5k -YXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJTQSBHMTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxVYOPM -vLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7b -rEi56rAUjtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzk -ik/HEzxux9UTl7Ko2yRpg1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4z -O8vbUZeUapU8zhhabkvG/AePLhq5SvdkNCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8R -tOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY+m0o/DjH40ytas7ZTpOS -jswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+lKXHiHUh -sd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+Ho -mnqT8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu -+zrkL8Fl47l6QGzwBrd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYR -i3drVByjtdgQ8K4p92cIiBdcuJd5z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnT -kCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU -8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC77EUOSh+1sbM2 -zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 -I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG -5D1rd9QhEOP28yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8 -qyiWXmFcuCIzGEgWUOrKL+mlSdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dP -AGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l8PjaV8GUgeV6Vg27Rn9vkf195hfk -gSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+FKrDgHGdPY3ofRRs -YWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNqqYY1 -9tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome -/msVuduCmsuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3 -J8tRd/iWkx7P8nd9H0aTolkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2 -wq1yVAb+axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZy -BiElxky8j3C7DOReIoMt0r7+hVu05L0= ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno TLS Root CA 2023 O=Microsec Ltd. -# Subject: CN=e-Szigno TLS Root CA 2023 O=Microsec Ltd. -# Label: "e-Szigno TLS Root CA 2023" -# Serial: 71934828665710877219916191754 -# MD5 Fingerprint: 6a:e9:99:74:a5:da:5e:f1:d9:2e:f2:c8:d1:86:8b:71 -# SHA1 Fingerprint: 6f:9a:d5:d5:df:e8:2c:eb:be:37:07:ee:4f:4f:52:58:29:41:d1:fe -# SHA256 Fingerprint: b4:91:41:50:2d:00:66:3d:74:0f:2e:7e:c3:40:c5:28:00:96:26:66:12:1a:36:d0:9c:f7:dd:2b:90:38:4f:b4 ------BEGIN CERTIFICATE----- -MIICzzCCAjGgAwIBAgINAOhvGHvWOWuYSkmYCjAKBggqhkjOPQQDBDB1MQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xFzAVBgNVBGEMDlZBVEhVLTIzNTg0NDk3MSIwIAYDVQQDDBllLVN6aWdubyBU -TFMgUm9vdCBDQSAyMDIzMB4XDTIzMDcxNzE0MDAwMFoXDTM4MDcxNzE0MDAwMFow -dTELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRYwFAYDVQQKDA1NaWNy -b3NlYyBMdGQuMRcwFQYDVQRhDA5WQVRIVS0yMzU4NDQ5NzEiMCAGA1UEAwwZZS1T -emlnbm8gVExTIFJvb3QgQ0EgMjAyMzCBmzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAE -AGgP36J8PKp0iGEKjcJMpQEiFNT3YHdCnAo4YKGMZz6zY+n6kbCLS+Y53wLCMAFS -AL/fjO1ZrTJlqwlZULUZwmgcAOAFX9pQJhzDrAQixTpN7+lXWDajwRlTEArRzT/v -SzUaQ49CE0y5LBqcvjC2xN7cS53kpDzLLtmt3999Cd8ukv+ho2MwYTAPBgNVHRMB -Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUWYQCYlpGePVd3I8K -ECgj3NXW+0UwHwYDVR0jBBgwFoAUWYQCYlpGePVd3I8KECgj3NXW+0UwCgYIKoZI -zj0EAwQDgYsAMIGHAkIBLdqu9S54tma4n7Zwf2Z0z+yOfP7AAXmazlIC58PRDHpt -y7Ve7hekm9sEdu4pKeiv+62sUvTXK9Z3hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZl -C9p2x1L/Cx6AcCIwwzPbGO2E14vs7dOoY4G1VnxHx1YwlGhza9IuqbnZLBwpvQy6 -uWWL ------END CERTIFICATE----- - -# Issuer: CN=SECOM TLS RSA Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Subject: CN=SECOM TLS RSA Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Label: "SECOM TLS RSA Root CA 2024" -# Serial: 17188327524208271538 -# MD5 Fingerprint: d0:a4:db:32:eb:44:98:d2:62:0b:3e:bc:4d:7c:5c:e9 -# SHA1 Fingerprint: fb:97:96:7c:ef:8d:98:63:06:c0:3b:b6:11:f8:e0:13:97:a2:98:d3 -# SHA256 Fingerprint: 14:35:f2:25:c5:d2:52:d7:a2:19:48:cc:3c:e6:2a:ec:fa:88:00:1e:3d:d7:2d:1c:c3:55:51:00:eb:37:2f:93 ------BEGIN CERTIFICATE----- -MIIFmjCCA4KgAwIBAgIJAO6JNNDLgOCyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNV -BAYTAkpQMSYwJAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEj -MCEGA1UEAxMaU0VDT00gVExTIFJTQSBSb290IENBIDIwMjQwHhcNMjQwMTMxMDUx -MTU1WhcNNDkwMTE0MDUxMTU1WjBaMQswCQYDVQQGEwJKUDEmMCQGA1UEChMdU0VD -T00gVHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4xIzAhBgNVBAMTGlNFQ09NIFRMUyBS -U0EgUm9vdCBDQSAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -4TjizUwzxbInq8Tx11gaFYNk5fO+34y7TyM4neh0UgL5JIZbJNLTz2x//L/B71+5 -m6X6nGIr7d4lFJBGtjO677hXOz93zkcWaUTm3VbOAjBlt4YWxlcccBHXuZ7o3Q+4 -R+ormrBdHeJ1CTUEG8ttQbKIl3G7OZYbnH8/pP8cjPub/0kDVNuMzp7xsVRROOis -Qt53fMoJLlYgoebbuMphOqMCtjkJ7R6efEMfLp8UAVi9ZaLRn76ET/CJkk925ndu -uufC4BatS4mnXFmxN0vUXb0ij9B8O/D8gixQEsVSD4GK8FWRPh3bVd/6bzdkHGJj -y21XI0yejVomZUbRrOfNuz0boPGV1pt18fFC39IHQEth3OFqb5NDO3L+A9bNqTgA -yUgRmIn4ucgDc/Ri/Km3V51ueZjy1/yk0qwJVadAVVrCt56iNeXOyEvzJADGgDQ8 -E1Pdaqct8Cynz/47ReQM62vFYO08wcQkrjmX/tesiko1V1yyaf6EfPzUFzmaGy9x -vkCwdbm15EdTolOjE0H2Vb5/APDOyCFEokiYGmXTLdAUl0wKZ4IyjkHGzy0jhpaX -EXE/GJcEvI6VzEchjaBL03EJ0h9pG4OqeIOycKvAo3A+TbetyfsrgYyHzU0a7/qU -jGat1AAq1nVljMpKqpinPTsf/d9H39FTUeJL7TpzzjUCAwEAAaNjMGEwHQYDVR0O -BBYEFCzrchKOWHdkNRVWNQFXB6l9DTbmMB8GA1UdIwQYMBaAFCzrchKOWHdkNRVW -NQFXB6l9DTbmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBDAUAA4ICAQAVwsvluSafaez5tFPR/hRTBzRxEyMMQF3XJXCVi3yegZyK -oec7hmE6jx2ZM8KgM1kn2yJRwFXHX8zUW9nBLEDWc4wuE8LrlZqhGZM9pJQXGmGz -ResDJV6JgRBna+j4sA1M7yIdlvL0sAfFXFCTRaWTD4E1V99RLrFzWfTcC+e180hD -uNMpqOEo46+lMeW/Wvh7ifOQs+kiK0O2gHxQDNxslSavnCs4V7l8HRDJ2La10o70 -Bo7VLzf1W8MBvv0VTnxB+NjT5qTAbhGFh9Gvp4BaJpmdUf0C5CEP6dbQlfgxWfzY -r69yVT6dPQB+GFEaY03IMY+AcBCs+om1fNxrQXt9zoofMBNFbLhvpNH/JsXWdGUz -fNbO12uswTa5wah8LB18FTQN2/zPHYmvBEoLuyUgZ09VNLJo5YA0kXItVYkLjMe2 -SixzK4scUHv81IK99I91DWx7FwMVKw2xgFp+ZLYB2dnpQQrqwlW64glHUcK2N9BD -snjLSxeZ+UPECh9RxH4WAcKiZW+cqaKMmhP2WBfR4IcR7NOL32ml11ds87hhV1CZ -WWFCJAcCidYZz6CZa8exzHojP9SB5RH0/v1KdHAisqhSjtJl/UIAHIQ48elOn8wr -TdFap4Yb5aHglmMeNx+fAIhDluWVfxTO7H4dTPU+SFVRMLAh+wwKZfqb94nMeQ== ------END CERTIFICATE----- - -# Issuer: CN=SECOM TLS ECC Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Subject: CN=SECOM TLS ECC Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Label: "SECOM TLS ECC Root CA 2024" -# Serial: 9329818985461676612 -# MD5 Fingerprint: 99:d3:9d:e4:d2:b1:2d:f0:2a:04:67:85:f3:df:46:d6 -# SHA1 Fingerprint: 7a:1f:22:2d:72:b2:c3:19:87:44:db:61:69:e8:a6:4b:d7:0d:44:0e -# SHA256 Fingerprint: 6a:b2:ab:75:f5:1c:b4:f4:f0:15:62:03:fb:f6:f6:46:23:2f:51:4b:e0:59:f6:28:33:30:8b:82:b4:d7:2d:b1 ------BEGIN CERTIFICATE----- -MIICTDCCAdGgAwIBAgIJAIF6LO+PI3pEMAoGCCqGSM49BAMDMFoxCzAJBgNVBAYT -AkpQMSYwJAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEjMCEG -A1UEAxMaU0VDT00gVExTIEVDQyBSb290IENBIDIwMjQwHhcNMjQwMTMxMDU1MjM0 -WhcNNDkwMTE0MDU1MjM0WjBaMQswCQYDVQQGEwJKUDEmMCQGA1UEChMdU0VDT00g -VHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4xIzAhBgNVBAMTGlNFQ09NIFRMUyBFQ0Mg -Um9vdCBDQSAyMDI0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7NzFMtu9dzQXSNC1 -2fabk0+GlC5finB3R7XaZonRUd20aFiWObtuNBCLUZSfk6QXAE55BjEXsXQ/NG8y -UqicXjsu9ksDK3JZBgCwLOVh6+nwJXTvso/dEj/GUYH5mBdoo2MwYTAdBgNVHQ4E -FgQUO3YReyl04k4GTFaCQNAhL3qzydUwHwYDVR0jBBgwFoAUO3YReyl04k4GTFaC -QNAhL3qzydUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZI -zj0EAwMDaQAwZgIxAN3ib8fi1pMYtAPjMilB5e5/H+t5CL0xPL+cZ5oTTZuSCjpA -n1v7F/VAr8bFxQXAowIxAKsBVO1ACFp7skwzPvdv1EUY5a897WGLT4lb+bjxFAWy -l8wDcZJdwGZ/pAHxt1AJ1g== ------END CERTIFICATE----- - -# Issuer: CN=Telia EC TLS Root CA v3 O=Telia Company AB -# Subject: CN=Telia EC TLS Root CA v3 O=Telia Company AB -# Label: "Telia EC TLS Root CA v3" -# Serial: 8028200332079443110287896228123317 -# MD5 Fingerprint: b6:fa:6a:5c:42:fb:c5:67:72:c0:e0:2f:72:fb:5a:44 -# SHA1 Fingerprint: b4:d6:07:c2:a5:95:bc:5b:f4:67:4d:c9:dc:6f:6f:0a:00:7a:a5:35 -# SHA256 Fingerprint: 09:8e:08:a9:1d:bb:f7:74:78:b9:6c:ce:b8:9b:14:13:a5:da:37:b7:c8:62:60:6a:95:5d:eb:07:17:9f:43:26 ------BEGIN CERTIFICATE----- -MIICMjCCAbegAwIBAgIPAYvSIlRjTQSLbOVHH9K1MAoGCCqGSM49BAMDMEoxCzAJ -BgNVBAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSAwHgYDVQQDDBdU -ZWxpYSBFQyBUTFMgUm9vdCBDQSB2MzAeFw0yMzExMTUwODU1MjZaFw00ODA1MjMx -MTAwMDBaMEoxCzAJBgNVBAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFC -MSAwHgYDVQQDDBdUZWxpYSBFQyBUTFMgUm9vdCBDQSB2MzB2MBAGByqGSM49AgEG -BSuBBAAiA2IABMHIlhVDLbmFKUpW0iK4dpryT6emYOeS31JPwWnWPmkWRrAkTbPX -40sQfHI9mpR7Rbktu3ngg6W+BBSXSechtMCnBmWXj/EaVlmV5cY1jD2HoTfhBQ3A -acpCNMLJK4NpZaNjMGEwHwYDVR0jBBgwFoAU1GToQ4g6cy/QGnGCNgtehd7H3kMw -HQYDVR0OBBYEFNRk6EOIOnMv0BpxgjYLXoXex95DMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2kAMGYCMQCXAUdS/9bbJ8A1JYaG -f/bWt/s7Ta0ot5Ulno8OjSNYRWQIlS4tVWldvTAVA7heOFgCMQCvKr8+Z2Rn+OBr -5UHzlgBObpad1LuwNTRcdNgUJxIWadcki+UBLEi1/AURKV5md2M= ------END CERTIFICATE----- - -# Issuer: CN=Telia RSA TLS Root CA v3 O=Telia Company AB -# Subject: CN=Telia RSA TLS Root CA v3 O=Telia Company AB -# Label: "Telia RSA TLS Root CA v3" -# Serial: 8028214673410753541795188766939845 -# MD5 Fingerprint: f4:8b:9c:f3:f8:63:cf:dc:25:8f:b4:bb:a2:e9:9d:e2 -# SHA1 Fingerprint: b5:2e:88:4e:40:c1:11:fb:50:c7:e2:4f:ac:18:2b:bd:68:15:d2:34 -# SHA256 Fingerprint: d1:3d:b1:29:4c:45:eb:c6:fc:86:c6:bb:f6:9f:a2:9b:df:e6:92:df:f7:c7:13:c2:43:c7:a9:56:c6:a2:28:4c ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgIPAYvSUKtCVSxHWr2h3BrFMA0GCSqGSIb3DQEBDAUAMEsx -CzAJBgNVBAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSEwHwYDVQQD -DBhUZWxpYSBSU0EgVExTIFJvb3QgQ0EgdjMwHhcNMjMxMTE1MDk0NzQyWhcNNDgw -NTIzMTEwMDAwWjBLMQswCQYDVQQGEwJTRTEZMBcGA1UECgwQVGVsaWEgQ29tcGFu -eSBBQjEhMB8GA1UEAwwYVGVsaWEgUlNBIFRMUyBSb290IENBIHYzMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsV89KG19hCf4S1Fvk8D3TyDERhmcvx8F -7Kmb4WATx3ije1id3KHxRE0TKmcNCbAQ57bvHFEYa4hR2l20VjVadExqOW+2ld99 -MbEiO+jRVOz+BbxLxJnmGwCqI+BfuTjjVReDxsxjQvjgBsClaO/sm5i70nlZcWGR -tIkvWDK3NNkT5RtwXc/O8NTFVpbUqT6cRjIj3olAblR+lRf4Ffy5o+Q9fabjYn9Z -9S4itruElcEFf9Ljk7fwdTycT/rvJW9w/B3G2a3r0f/zXNOVruIBcqE6pkSospAC -U2bG42fYKrbM/GWnp7u+p9Frz4jaNwpb4YHuEeS8BratNcP8X62jXIvvKHxlsMDJ -Cnb4U8JzFOLsU6mohVY58BdZrvi0Gk9UOuqmgoG6dskHoksjZTlK61D/InzmEoA1 -yAYJFDVysjRxDUOu9cAwANbqmq77WIFL6BpnZgVqPtMfG6wN8BrTKdapvilVsYR5 -9BFgIsAVBMxrGh+W+QcvmJafUpASvlArKvVG2FI4i6PiLjSBT0+6F6EQLrYqefOQ -F/fBNEXb+njUQ0SUVrAqtH4Y+OjCI/a4/JJQppxeemZcQ0SUShgiI5AM5xHO5iya -UrTjYH4zxUz9j+1FEbDH/xpstr1gXBykspup+hRTaJcbA+UbpJqtWZndAPddJmt6 -YJQ+dU3pDu8CAwEAAaNjMGEwHwYDVR0jBBgwFoAUsMep0t2yKFZzBJSMFFxIbzdS -kqgwHQYDVR0OBBYEFLDHqdLdsihWcwSUjBRcSG83UpKoMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQBdYzFsNGDRk7bR -/AgRKq+5637YuOW+w6uhpoS0VnKMUpyHCwku86hEvqivakPtfmlm4bFwt++sb/8O -XsWBqtfbXMaBNDTZl8XRMJuLWOW2JrbKkRzgG0eBUcvsadG1rrhbmZqYvFXaAZO7 -o4TdOZzxhBB5GOAWWXB3IeraNP4J63zyo9n8Gqw3sJBG44em5hoYjBffP+npibys -lnslRi4L6xHsCYj/Pab+OlqbMCB6v+sTCLeEIukRVzoR9aQ45pEK7Z1QBnSsbAKQ -tss0JKD9d/mX143H1xePjPhTXlv5JCkhrcj+SShz0P9+EHoWe6m9lyUEOIVn0rp+ -yVJWNbmyDv3VkwFxHC1ApSQsgSimjGQ4wtr6cSmordYxkV+Ro8lOIIhRksXPyDk2 -7gW6IjUXCkZKpxFjkL3jiBSc8SkxnwCWtXg8xwNwdFVNBGLCCuJnsneYXjJNqzRq -UcoGwzsvF3Qi/ZnHUNvISdevlgIAXL4Wvrxaqvoa01wB+GCfs57RTGE4TvAGhKNK -us8K3hRT1BSpigzMIRzSxtAOrqPN6j//QSmW9f8Jcncri4j2ihSpVrFU0NdNkMhZ -eAKidTFPsxCVFuW4Aniz7jqiw5sWtjbQrlW035izIEU4sYwQoC1Nx0Svy+mMTRai -50LqFQ+A1/Hq6xHHDNx7CI83d23Erw== ------END CERTIFICATE----- diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/cd.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/cd.cp312-win_amd64.pyd deleted file mode 100644 index 0982f00..0000000 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/cd.cp312-win_amd64.pyd +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be1d8801c9785a52e5bc1b0c77ceca2c88041a5d9b9bac7162d767f712ea10e3 -size 10752 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md.cp312-win_amd64.pyd index fabca65..cd89809 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3d9c05de6a69b7adc024de7b3ffe823e8c72f080e4a89d1aac4b24173945815 +oid sha256:5c11b2fbe20a75aedcde205fbf0fdda2fa1ca9bd914ae72656dc6fb651bfded0 size 10752 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md__mypyc.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md__mypyc.cp312-win_amd64.pyd new file mode 100644 index 0000000..d52edfa --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/charset_normalizer/md__mypyc.cp312-win_amd64.pyd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffe8d64a38b4060055beb2076e669b61034c045e3ec53bac74ee66bba3fc26c0 +size 125440 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json index f1ce456..427c018 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_runtime/cw_camera_worker_build_identity.json @@ -1,18 +1,18 @@ { "schemaVersion": "cw-camera-worker-build-identity-v1", - "workerVersion": "0.1.4", - "createdUtc": "2026-08-08T17:11:19.216870+00:00", + "workerVersion": "0.1.5", + "createdUtc": "2026-08-08T20:03:04.908909+00:00", "python": "3.12.13", "sourceRootRelative": "cwai_sources/repository", "sourceSha256": { "MachineLearning/CameraDirector/adjacent_transition.py": "6c1b62c2996960af23d62e9c3acd3114600effda03273b006f7076c467c4bdfa", - "MachineLearning/CameraDirector/build_hybrid_preparation_cache.py": "164a3574d5fad05a627bf6d0c6169d42039043bf9a2cd62effbd978359e828f2", - "MachineLearning/CameraDirector/camera_kinematics.py": "c7b85616ef44a0f28f11702459d67d78aad7cf26ed00c2548ecb78b06fc27025", + "MachineLearning/CameraDirector/build_hybrid_preparation_cache.py": "f948b1a68352893b078ac1f6ef458df2107565378eed32890276776ca0dfdad6", + "MachineLearning/CameraDirector/camera_kinematics.py": "75816a55ac1dc655731432f061c2f4356cc3b583f3ce33797578431adcd9ba39", "MachineLearning/CameraDirector/camera_runtime_data.py": "29fd30a1c97d384f7bb22d024a4f88178f6245858925c302b059a7a1afdeaac1", "MachineLearning/CameraDirector/cw_camera_cli.py": "943870a4cdec7e4b830b9c945d690e700902cf2a37d1e49987bba85bf0b0ea87", - "MachineLearning/CameraDirector/cw_camera_runtime.py": "94d9f03488978cf34cadbc9495542983c15c8e5050be6d7b9b0317845ca25242", - "MachineLearning/CameraDirector/data_driven_cut_planner.py": "b6d48d03f8725aa8327abe81afa483c43edc368e7dee9f9e7228e21982f71ad2", - "MachineLearning/CameraDirector/generate_hybrid.py": "fbb7bd07fb32f81efd259b4bb56e30404df59eb98fe05c9c92429a214f666659", + "MachineLearning/CameraDirector/cw_camera_runtime.py": "c4cfbc61173cb541932632e3b0a0751ae75c9d6ca3b56680722caa78f74e797d", + "MachineLearning/CameraDirector/data_driven_cut_planner.py": "36cf86a80577278d2e966cb0ebf7c3110b5b1dda5abd1d8a6b0a76e31d10e32b", + "MachineLearning/CameraDirector/generate_hybrid.py": "4bf19ffdd8e244a82b4ea0656bad030a30470a9e2065bdccde8bfb9d99922fea", "MachineLearning/CameraDirector/hybrid_candidate_cache.py": "a0a5b6a8f612f18cb2875394f17ed89950e1e62e38c1226457d9e35848f6e380", "MachineLearning/CameraDirector/hybrid_cut_reference.py": "53521d9e31d315c011892961887baf0cde6451020bf39c9d080a5072d4707fcb", "MachineLearning/CameraDirector/hybrid_preparation_cache.py": "1b0df53124109dee2d744777979a0553999cb276cb6f538a17ddce6516e3da8b", @@ -20,11 +20,11 @@ "MachineLearning/CameraDirector/planner.py": "8575788c0ff1e984f8238354dcd6de2dab9f62afeb71fa4b77ebfc7c66400372", "MachineLearning/CameraDirector/shot_features.py": "fd912b00320ea53ca682c010de6ed1102edcd021ceb4822a5785033a500786fe", "MachineLearning/CameraDirector/train.py": "40e9e9a9ab824d596b14f987b2977f187695c3d5a2a2bde9da67e95d38d78836", - "MachineLearning/CameraDirector/trajectory_quality.py": "8ede816e1d155e9d35fd6d18b3aaa145cd4957e205d898e11c1691222ef420a2" + "MachineLearning/CameraDirector/trajectory_quality.py": "20cd2ddc1b2349f8c33f6d1460580f37964a521eaa86ceee5b8ae457512ba49d" }, "preparationLogicIdentifier": "acba2a46d9d979b013b7154bada6b6a8a7adfd7acd1721876ce6699ed4e03e84", - "candidateLogicIdentifier": "a9503f8764910d763fe0135f6b1425b0cba289dbd1dd149609d2c00e508470c1", - "generationCodeIdentifier": "05e85df5ac7eb614f68e340502cb03a9c5a073f91eba5d16d642340728d51d67", + "candidateLogicIdentifier": "7c771be40d4c6ebc6b15a96c64ed05062f6109d20605670be9b0e07587f2b25a", + "generationCodeIdentifier": "470c77fe5d69046aa7bcadfbbb1337d6f0025fe0be374cb2302ea41ae00cdc47", "generationCodeFiles": [ "adjacent_transition.py", "camera_kinematics.py", diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/build_hybrid_preparation_cache.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/build_hybrid_preparation_cache.py index e65cd64..39438b4 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/build_hybrid_preparation_cache.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/build_hybrid_preparation_cache.py @@ -260,10 +260,9 @@ def run(args: argparse.Namespace) -> dict: summary = { "targetSongId": target_record.id, "targetDatasetId": target_record.dataset_id, - "targetEvaluationGroupId": ( - target_entry["evaluationGroupId"] - if target_entry is not None - else None + "targetEvaluationGroupId": generate_hybrid.target_reference_evaluation_group( + entries, + target_record, ), "targetTrainingIndexMembership": target_entry is not None, "targetInputKind": ( diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/camera_kinematics.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/camera_kinematics.py index e4115b9..950c1b4 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/camera_kinematics.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/camera_kinematics.py @@ -19,7 +19,7 @@ import numpy as np TRANSLATION_KINEMATIC_POLICY_VERSION = ( - "yamo-angle-aware-turn-v4-c2-continuity-guard" + "yamo-angle-aware-turn-v6-natural-easing-impulse-c2" ) DEFAULT_REVERSAL_ANGLE_DEGREES = 40.0 DEFAULT_STOP_SPEED_RATIO = 0.12 @@ -44,6 +44,31 @@ DEFAULT_ACCELERATION_GUARD_FLOOR_MPS2 = 25.0 DEFAULT_MAXIMUM_JERK_REGRESSION_RATIO = 1.35 DEFAULT_MAXIMUM_JERK_REGRESSION_DELTA_MPS3 = 350.0 DEFAULT_JERK_GUARD_FLOOR_MPS3 = 350.0 +# A second, deliberately narrow gate catches a concentrated turn that evades +# the 40-degree rule yet still carries an edit-visible sideways impulse. The +# thresholds were calibrated against 2,479 authored turn events: the combined +# gate adds only 10 events (0.4%) beyond the existing abrupt-turn policy while +# covering the reviewed Shot_066 profile (high stop ratio plus ~22 m/s^2 and +# ~200 m/s^3 local lateral dynamics). +DEFAULT_IMPULSIVE_TURN_ANGLE_DEGREES = 15.0 +DEFAULT_IMPULSIVE_STOP_SPEED_RATIO = 0.78 +DEFAULT_IMPULSIVE_CORNER_CONCENTRATION = 0.40 +DEFAULT_IMPULSIVE_LATERAL_ACCELERATION_MPS2 = 22.0 +DEFAULT_IMPULSIVE_LATERAL_JERK_MPS3 = 200.0 +DEFAULT_IMPULSIVE_TARGET_SPEED_RATIO = 0.72 +DEFAULT_IMPULSIVE_REVERSAL_WINDOW_SECONDS = 0.50 +# A generated curve can satisfy the broad monotonic-speed definition of +# ``natural_easing`` while its turn is still concentrated enough to read as a +# lateral kick. Keep this as a separate, narrower contradiction gate rather +# than weakening the micro-turn thresholds above. The reviewed Shot_066 is +# 59.60 degrees / 0.812 stop ratio / 0.355 concentration / 22.69 m/s^2 / +# 167.84 m/s^3. A scan of 1,395 detected events across 2,006 authored shots +# found only three grouped events satisfying every condition below (0.22%); +# all three also carried substantially larger 645--958 m/s^3 lateral jerk. +DEFAULT_NATURAL_IMPULSE_TARGET_EXCESS_RATIO = 0.08 +DEFAULT_NATURAL_IMPULSE_CORNER_CONCENTRATION = 0.35 +DEFAULT_NATURAL_IMPULSE_LATERAL_ACCELERATION_MPS2 = 22.0 +DEFAULT_NATURAL_IMPULSE_LATERAL_JERK_MPS3 = 160.0 def turn_speed_ratio_limit(angle_degrees: float) -> float: @@ -99,9 +124,16 @@ class TranslationReversal: target_speed_ratio: float corner_concentration: float natural_easing_detected: bool + impulsive: bool = False + lateral_acceleration_mps2: float = 0.0 + lateral_jerk_mps3: float = 0.0 @property def abrupt(self) -> bool: + if self.impulsive: + return self.stop_speed_ratio > ( + self.target_speed_ratio + DEFAULT_SPEED_RATIO_TOLERANCE + ) if self.natural_easing_detected and self.stop_speed_ratio <= ( natural_turn_speed_ratio_limit(self.angle_degrees) + DEFAULT_SPEED_RATIO_TOLERANCE @@ -184,16 +216,71 @@ def _group_reversal_candidates( group, key=lambda event: (event.stop_speed_ratio, event.frame), ) + impulsive_events = [event for event in group if event.impulsive] + representative = ( + max( + impulsive_events, + key=lambda event: ( + event.lateral_jerk_mps3, + event.lateral_acceleration_mps2, + -event.frame, + ), + ) + if impulsive_events + else low_speed_event + ) maximum_angle = max(event.angle_degrees for event in group) + maximum_concentration = max( + event.corner_concentration for event in group + ) + maximum_lateral_acceleration = max( + event.lateral_acceleration_mps2 for event in group + ) + maximum_lateral_jerk = max( + event.lateral_jerk_mps3 for event in group + ) + maximum_angle_target = turn_speed_ratio_limit(maximum_angle) + # A detector group represents one physical corner, but its clearest + # slowdown, largest angle and largest lateral impulse commonly occur + # on neighbouring centers. Evaluate this contradiction after + # grouping; requiring every signal on one center missed Shot_066 even + # though the aggregate event was an edit-visible kick. + natural_easing_impulse = bool( + low_speed_event.natural_easing_detected + and maximum_angle + >= DEFAULT_REVERSAL_ANGLE_DEGREES + - DEFAULT_ANGLE_COMPARISON_TOLERANCE_DEGREES + and low_speed_event.stop_speed_ratio + >= DEFAULT_IMPULSIVE_STOP_SPEED_RATIO + and low_speed_event.stop_speed_ratio - maximum_angle_target + >= DEFAULT_NATURAL_IMPULSE_TARGET_EXCESS_RATIO + and maximum_concentration + >= DEFAULT_NATURAL_IMPULSE_CORNER_CONCENTRATION + and maximum_lateral_acceleration + >= DEFAULT_NATURAL_IMPULSE_LATERAL_ACCELERATION_MPS2 + and maximum_lateral_jerk + >= DEFAULT_NATURAL_IMPULSE_LATERAL_JERK_MPS3 + ) + impulsive = bool(impulsive_events) or natural_easing_impulse events.append( TranslationReversal( - frame=low_speed_event.frame, + frame=representative.frame, angle_degrees=maximum_angle, - stop_speed_ratio=low_speed_event.stop_speed_ratio, - flank_speed_mps=low_speed_event.flank_speed_mps, - target_speed_ratio=turn_speed_ratio_limit(maximum_angle), - corner_concentration=max(event.corner_concentration for event in group), - natural_easing_detected=(low_speed_event.natural_easing_detected), + stop_speed_ratio=representative.stop_speed_ratio, + flank_speed_mps=representative.flank_speed_mps, + target_speed_ratio=( + min( + maximum_angle_target, + DEFAULT_IMPULSIVE_TARGET_SPEED_RATIO, + ) + if impulsive + else maximum_angle_target + ), + corner_concentration=maximum_concentration, + natural_easing_detected=(representative.natural_easing_detected), + impulsive=impulsive, + lateral_acceleration_mps2=maximum_lateral_acceleration, + lateral_jerk_mps3=maximum_lateral_jerk, ) ) return events @@ -364,9 +451,73 @@ def analyze_translational_reversals( ) valid &= radius[centers] >= 0.1 + # Keep the original, angle-aware policy result separate. The impulsive + # gate below is a narrow fallback for turns that the established policy + # would otherwise preserve; it must not strengthen the slowdown already + # selected for an ordinary 40+ degree corner. + standard_valid = valid.copy() + local_speed_windows = np.lib.stride_tricks.sliding_window_view(speed, 4) local_minimum_speeds = np.min(local_speed_windows[centers - 2], axis=1) ratios = local_minimum_speeds / np.maximum(flank_speeds, 1e-12) + lateral_acceleration_peaks = np.zeros(len(centers), dtype=np.float64) + lateral_jerk_peaks = np.zeros(len(centers), dtype=np.float64) + if family != "orbit": + acceleration = np.diff(velocity, axis=0) * sample_rate + jerk = np.diff(acceleration, axis=0) * sample_rate + for result_index, center in enumerate(centers): + incoming = before_vectors[result_index] + incoming_norm = float(np.linalg.norm(incoming)) + if incoming_norm <= 1e-12: + continue + incoming_unit = incoming / incoming_norm + window_start = max(0, int(center) - persistence_frames) + acceleration_window = acceleration[ + window_start : min(len(acceleration), int(center) + persistence_frames) + ] + jerk_window = jerk[ + window_start : min(len(jerk), int(center) + persistence_frames) + ] + if len(acceleration_window): + lateral = acceleration_window - ( + acceleration_window @ incoming_unit + )[:, None] * incoming_unit + lateral_acceleration_peaks[result_index] = float( + np.max(np.linalg.norm(lateral, axis=1)) + ) + if len(jerk_window): + lateral = jerk_window - ( + jerk_window @ incoming_unit + )[:, None] * incoming_unit + lateral_jerk_peaks[result_index] = float( + np.max(np.linalg.norm(lateral, axis=1)) + ) + impulsive_valid = ( + (flank_speeds >= minimum_flank_speed_mps) + & ( + angles + >= DEFAULT_IMPULSIVE_TURN_ANGLE_DEGREES + - DEFAULT_ANGLE_COMPARISON_TOLERANCE_DEGREES + ) + & (before_coherence >= minimum_flank_direction_coherence) + & (after_coherence >= minimum_flank_direction_coherence) + & ( + corner_concentration + >= max( + minimum_corner_concentration, + DEFAULT_IMPULSIVE_CORNER_CONCENTRATION, + ) + ) + & (np.minimum(before_travel, after_travel) >= minimum_flank_travel_meters) + & (ratios >= DEFAULT_IMPULSIVE_STOP_SPEED_RATIO) + & ( + lateral_acceleration_peaks + >= DEFAULT_IMPULSIVE_LATERAL_ACCELERATION_MPS2 + ) + & (lateral_jerk_peaks >= DEFAULT_IMPULSIVE_LATERAL_JERK_MPS3) + ) + else: + impulsive_valid = np.zeros(len(centers), dtype=bool) persistence_speed_windows = np.lib.stride_tricks.sliding_window_view( speed, persistence_frames, @@ -393,6 +544,30 @@ def analyze_translational_reversals( & (after_monotonic_ratio >= 0.75) & (ratios <= natural_speed_limits + DEFAULT_SPEED_RATIO_TOLERANCE) ) + standard_speed_limits = np.asarray( + [turn_speed_ratio_limit(float(angle)) for angle in angles], + dtype=np.float64, + ) + standard_abrupt = standard_valid & ~( + natural_easing + & (ratios <= natural_speed_limits + DEFAULT_SPEED_RATIO_TOLERANCE) + ) & (ratios > standard_speed_limits + DEFAULT_SPEED_RATIO_TOLERANCE) + # Only upgrade events that evade the established abrupt-turn rule. This + # keeps authored 40--180 degree slowdown curves on their calibrated policy + # while admitting the reviewed concentrated, high-jerk micro-turn class. + impulsive_valid &= ~standard_abrupt + if np.any(standard_abrupt): + # Adjacent detector centers represent one physical corner and are + # grouped later. Clear the fallback throughout that grouping radius, + # otherwise a nearby 39.9-degree center could relabel an ordinary + # 40-degree event as impulsive and incorrectly strengthen its target. + standard_abrupt_centers = centers[standard_abrupt] + impulsive_valid &= ~np.any( + np.abs(centers[:, None] - standard_abrupt_centers[None, :]) + <= persistence_frames, + axis=1, + ) + valid |= impulsive_valid candidates = [ TranslationReversal( frame=int(frame), @@ -402,6 +577,9 @@ def analyze_translational_reversals( target_speed_ratio=turn_speed_ratio_limit(float(angle)), corner_concentration=float(concentration), natural_easing_detected=bool(is_naturally_eased), + impulsive=bool(is_impulsive), + lateral_acceleration_mps2=float(lateral_acceleration), + lateral_jerk_mps3=float(lateral_jerk), ) for ( frame, @@ -410,6 +588,9 @@ def analyze_translational_reversals( flank_speed, concentration, is_naturally_eased, + is_impulsive, + lateral_acceleration, + lateral_jerk, ) in zip( centers[valid], angles[valid], @@ -417,6 +598,9 @@ def analyze_translational_reversals( flank_speeds[valid], corner_concentration[valid], natural_easing[valid], + impulsive_valid[valid], + lateral_acceleration_peaks[valid], + lateral_jerk_peaks[valid], ) ] @@ -611,14 +795,27 @@ def _dynamics_regression_exceeds_guard( def _event_metadata(events: list[TranslationReversal]) -> dict[str, object]: abrupt = [event for event in events if event.abrupt] + impulsive = [event for event in events if event.impulsive] return { "count": len(events), "abruptCount": len(abrupt), "frames": [event.frame for event in events], "abruptFrames": [event.frame for event in abrupt], "anglesDegrees": [event.angle_degrees for event in events], + "stopSpeedRatios": [event.stop_speed_ratio for event in events], "targetSpeedRatios": [event.target_speed_ratio for event in events], "cornerConcentrations": [event.corner_concentration for event in events], + "naturalEasingDetected": [ + event.natural_easing_detected for event in events + ], + "impulsiveCount": len(impulsive), + "impulsiveFrames": [event.frame for event in impulsive], + "lateralAccelerationMetersPerSecondSquared": [ + event.lateral_acceleration_mps2 for event in events + ], + "lateralJerkMetersPerSecondCubed": [ + event.lateral_jerk_mps3 for event in events + ], "worstStopSpeedRatio": ( float(max(event.stop_speed_ratio for event in events)) if events else 0.0 ), @@ -641,12 +838,15 @@ def regularize_translational_reversals( *, sample_rate: float = 60.0, reversal_window_seconds: float = DEFAULT_REVERSAL_WINDOW_SECONDS, + apply_policy: bool = True, ) -> tuple[np.ndarray, dict[str, object]]: """Apply angle-aware braking to abrupt turns and orbit reversals.""" positions = _validated_positions(positions_meters) if not math.isfinite(reversal_window_seconds) or reversal_window_seconds <= 0.0: raise ValueError("reversal_window_seconds must be finite and positive.") + if not isinstance(apply_policy, bool): + raise ValueError("apply_policy must be a boolean.") family = motion_family(motion_type) before = analyze_translational_reversals( positions, @@ -658,21 +858,37 @@ def regularize_translational_reversals( applied_frames: list[int] = [] applied_angles: list[float] = [] applied_target_speed_ratios: list[float] = [] + applied_impulsive_frames: list[int] = [] pass_count = 0 - pending_events = abrupt_before + pending_events = abrupt_before if apply_policy else [] if family not in {"static", "unsupported"} and pending_events: requested_radius = max( 6, int(round(reversal_window_seconds * sample_rate)), ) + impulsive_requested_radius = max( + requested_radius, + int( + round( + DEFAULT_IMPULSIVE_REVERSAL_WINDOW_SECONDS * sample_rate + ) + ), + ) # Only abrupt events detected on the untouched input are eligible. # Re-detecting and rewriting new window-boundary events caused a # three-pass cascade in real shots, multiplying acceleration and jerk # even though the final turn counter eventually reached zero. event_frames = [event.frame for event in pending_events] for event_index, event in enumerate(pending_events): - neighbor_limit = requested_radius + # The high-impulse fallback is intentionally rare, so give its + # braking envelope a slightly longer C2 runway instead of forcing + # a stronger speed change into the normal 0.35-second window. + neighbor_limit = ( + impulsive_requested_radius + if event.impulsive + else requested_radius + ) if event_index > 0: neighbor_limit = min( neighbor_limit, @@ -700,6 +916,8 @@ def regularize_translational_reversals( applied_frames.append(event.frame) applied_angles.append(event.angle_degrees) applied_target_speed_ratios.append(event.target_speed_ratio) + if event.impulsive: + applied_impulsive_frames.append(event.frame) pass_count = int(bool(applied_frames)) endpoint_adjustment = output[-1] - positions[-1] @@ -734,6 +952,7 @@ def regularize_translational_reversals( applied_frames.clear() applied_angles.clear() applied_target_speed_ratios.clear() + applied_impulsive_frames.clear() pass_count = 0 endpoint_adjustment_clamped = False @@ -753,6 +972,7 @@ def regularize_translational_reversals( "translationKinematicPolicyVersion": (TRANSLATION_KINEMATIC_POLICY_VERSION), "translationKinematicMotionFamily": family, "translationKinematicPolicyEligible": family not in {"static", "unsupported"}, + "translationKinematicPolicyApplicationEnabled": apply_policy, "translationKinematicPolicyApplied": bool(applied_frames), "translationKinematicDynamicsGuardTriggered": dynamics_guard_triggered, "translationKinematicAttemptedRegularizationCount": len( @@ -765,16 +985,71 @@ def regularize_translational_reversals( "translationAbruptReversalCountBefore": before_metadata["abruptCount"], "translationDirectionReversalFramesBefore": before_metadata["frames"], "translationAbruptReversalFramesBefore": before_metadata["abruptFrames"], + "translationDirectionReversalAnglesDegreesBefore": before_metadata[ + "anglesDegrees" + ], + "translationDirectionReversalStopSpeedRatiosBefore": before_metadata[ + "stopSpeedRatios" + ], + "translationDirectionReversalTargetSpeedRatiosBefore": before_metadata[ + "targetSpeedRatios" + ], + "translationDirectionReversalCornerConcentrationsBefore": before_metadata[ + "cornerConcentrations" + ], + "translationDirectionReversalNaturalEasingDetectedBefore": before_metadata[ + "naturalEasingDetected" + ], + "translationDirectionReversalLateralAccelerationMetersPerSecondSquaredBefore": ( + before_metadata["lateralAccelerationMetersPerSecondSquared"] + ), + "translationDirectionReversalLateralJerkMetersPerSecondCubedBefore": ( + before_metadata["lateralJerkMetersPerSecondCubed"] + ), "translationWorstStopSpeedRatioBefore": before_metadata["worstStopSpeedRatio"], "translationRegularizedReversalCount": len(applied_frames), "translationKinematicRegularizationPassCount": pass_count, "translationRegularizedReversalFrames": applied_frames, "translationRegularizedTurnAnglesDegrees": applied_angles, "translationRegularizedTargetSpeedRatios": (applied_target_speed_ratios), + "translationImpulsiveTurnCountBefore": before_metadata[ + "impulsiveCount" + ], + "translationImpulsiveTurnFramesBefore": before_metadata[ + "impulsiveFrames" + ], + "translationImpulsiveTurnRegularizedFrames": applied_impulsive_frames, + "translationImpulsiveTurnCountAfter": after_metadata[ + "impulsiveCount" + ], + "translationImpulsiveTurnFramesAfter": after_metadata[ + "impulsiveFrames" + ], "translationDirectionReversalCountAfter": after_metadata["count"], "translationAbruptReversalCountAfter": after_metadata["abruptCount"], "translationDirectionReversalFramesAfter": after_metadata["frames"], "translationAbruptReversalFramesAfter": after_metadata["abruptFrames"], + "translationDirectionReversalAnglesDegreesAfter": after_metadata[ + "anglesDegrees" + ], + "translationDirectionReversalStopSpeedRatiosAfter": after_metadata[ + "stopSpeedRatios" + ], + "translationDirectionReversalTargetSpeedRatiosAfter": after_metadata[ + "targetSpeedRatios" + ], + "translationDirectionReversalCornerConcentrationsAfter": after_metadata[ + "cornerConcentrations" + ], + "translationDirectionReversalNaturalEasingDetectedAfter": after_metadata[ + "naturalEasingDetected" + ], + "translationDirectionReversalLateralAccelerationMetersPerSecondSquaredAfter": ( + after_metadata["lateralAccelerationMetersPerSecondSquared"] + ), + "translationDirectionReversalLateralJerkMetersPerSecondCubedAfter": ( + after_metadata["lateralJerkMetersPerSecondCubed"] + ), "translationWorstStopSpeedRatioAfter": after_metadata["worstStopSpeedRatio"], "translationWorstTargetSpeedRatioExcessAfter": after_metadata[ "worstTargetSpeedRatioExcess" @@ -782,6 +1057,41 @@ def regularize_translational_reversals( "translationStopSpeedRatioLimit": DEFAULT_STOP_SPEED_RATIO, "translationReversalAngleMinimumDegrees": (DEFAULT_REVERSAL_ANGLE_DEGREES), "translationMinimumCornerConcentration": (DEFAULT_MINIMUM_CORNER_CONCENTRATION), + "translationImpulsiveTurnPolicy": { + "minimumAngleDegrees": DEFAULT_IMPULSIVE_TURN_ANGLE_DEGREES, + "minimumStopSpeedRatio": DEFAULT_IMPULSIVE_STOP_SPEED_RATIO, + "minimumCornerConcentration": ( + DEFAULT_IMPULSIVE_CORNER_CONCENTRATION + ), + "minimumLateralAccelerationMetersPerSecondSquared": ( + DEFAULT_IMPULSIVE_LATERAL_ACCELERATION_MPS2 + ), + "minimumLateralJerkMetersPerSecondCubed": ( + DEFAULT_IMPULSIVE_LATERAL_JERK_MPS3 + ), + "maximumTargetSpeedRatio": DEFAULT_IMPULSIVE_TARGET_SPEED_RATIO, + "decelerationAndAccelerationWindowSeconds": ( + DEFAULT_IMPULSIVE_REVERSAL_WINDOW_SECONDS + ), + "naturalEasingContradiction": { + "minimumOriginalTurnAngleDegrees": ( + DEFAULT_REVERSAL_ANGLE_DEGREES + ), + "minimumTargetSpeedRatioExcess": ( + DEFAULT_NATURAL_IMPULSE_TARGET_EXCESS_RATIO + ), + "minimumCornerConcentration": ( + DEFAULT_NATURAL_IMPULSE_CORNER_CONCENTRATION + ), + "minimumLateralAccelerationMetersPerSecondSquared": ( + DEFAULT_NATURAL_IMPULSE_LATERAL_ACCELERATION_MPS2 + ), + "minimumLateralJerkMetersPerSecondCubed": ( + DEFAULT_NATURAL_IMPULSE_LATERAL_JERK_MPS3 + ), + }, + "continuousOrbitExcluded": True, + }, "translationSpeedMetersPerSecondMaxBefore": dynamics_before[ "speedMetersPerSecondMax" ], diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py index e839110..b4bc1ee 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/cw_camera_runtime.py @@ -19,7 +19,7 @@ from typing import Any, Iterable BUILD_IDENTITY_SCHEMA_VERSION = "cw-camera-worker-build-identity-v1" BUILD_IDENTITY_FILE = "cw_camera_worker_build_identity.json" -WORKER_VERSION = "0.1.4" +WORKER_VERSION = "0.1.5" def is_frozen_runtime() -> bool: diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/data_driven_cut_planner.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/data_driven_cut_planner.py index e7dbbfb..a854c4f 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/data_driven_cut_planner.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/data_driven_cut_planner.py @@ -508,6 +508,14 @@ class CutPlannerConfig: preferred_bonus: float = 2.4 same_audio_bonus: float = 2.8 history_beam_width: int = 4 + # Authored timelines commonly hold their final camera through a long + # silent/idle export tail. Do not manufacture a fallback cut merely to + # satisfy the normal maximum shot duration once every causal activity + # signal has been inactive for at least two seconds. The threshold is + # intentionally near zero: this is an export-tail exception, not a way to + # lengthen quiet-but-active musical passages. + inactive_tail_minimum_frames: int = 120 + inactive_tail_signal_threshold: float = 1e-6 def __post_init__(self) -> None: integer_names = ( @@ -518,6 +526,7 @@ class CutPlannerConfig: "ultrashort_frames", "short_tail_frames", "history_beam_width", + "inactive_tail_minimum_frames", ) for name in integer_names: value = getattr(self, name) @@ -546,6 +555,7 @@ class CutPlannerConfig: "short_tail_cost", "preferred_bonus", "same_audio_bonus", + "inactive_tail_signal_threshold", ): value = float(getattr(self, name)) if not math.isfinite(value) or value < 0.0: @@ -760,6 +770,41 @@ def _robust_unit(values: np.ndarray) -> np.ndarray: return np.clip((values - low) / (high - low), 0.0, 1.0) +def _inactive_tail_start( + signals: CutSignals, + config: CutPlannerConfig, +) -> int | None: + """Return the first frame of a sufficiently long causal inactive suffix. + + The suffix must contain no normalized onset, mel-novelty, performer-motion, + beat, or onset-peak evidence above a near-zero threshold. Requiring an + earlier active frame prevents an entirely empty/new input from silently + disabling the normal maximum-shot contract. + """ + + activity = np.maximum.reduce( + ( + _robust_unit(signals.onset_strength), + _robust_unit(signals.motion_strength), + _robust_unit(signals.mel_novelty), + ) + ) + if len(signals.beat_frames): + activity[np.asarray(signals.beat_frames, dtype=np.int64)] = 1.0 + if len(signals.onset_peak_frames): + activity[np.asarray(signals.onset_peak_frames, dtype=np.int64)] = 1.0 + active = np.flatnonzero(activity > config.inactive_tail_signal_threshold) + if not len(active): + return None + start = int(active[-1]) + 1 + if ( + start <= 0 + or signals.frame_count - start < config.inactive_tail_minimum_frames + ): + return None + return start + + def _salient_peaks( values: np.ndarray, quantile: float, @@ -1546,6 +1591,15 @@ def _solve_global_dag( music_prefix = np.concatenate(([0.0], np.cumsum(music))) motion_prefix = np.concatenate(([0.0], np.cumsum(motion))) beat_proximity = _proximity(frames, signals.beat_frames, 30) + inactive_tail_start = _inactive_tail_start(signals, config) + protected_tail_frames = frozenset( + int(frame) + for frame in ( + *directives.locked_frames, + *directives.preferred_frames, + *same_audio.tolist(), + ) + ) q25 = _weighted_quantile(prior.duration_frames, prior.sample_weights, 0.25) q75 = _weighted_quantile(prior.duration_frames, prior.sample_weights, 0.75) density_scale = { @@ -1591,6 +1645,29 @@ def _solve_global_dag( destination_indices = np.arange( start_index + 1, min(candidate_count, end_limit), dtype=np.int64 ) + endpoint_index = candidate_count - 1 + endpoint_beyond_normal_limit = endpoint_index not in destination_indices + active_prefix_frames = ( + max(0, inactive_tail_start - start_frame) + if inactive_tail_start is not None + else signals.frame_count + ) + crosses_protected_tail_boundary = any( + start_frame < frame < signals.frame_count + for frame in protected_tail_frames + ) + inactive_tail_extension_allowed = bool( + inactive_tail_start is not None + and endpoint_beyond_normal_limit + and ( + start_frame <= inactive_tail_start + or start_frame in protected_tail_frames + ) + and active_prefix_frames <= config.maximum_shot_frames + and not crosses_protected_tail_boundary + ) + if inactive_tail_extension_allowed: + destination_indices = np.append(destination_indices, endpoint_index) if next_lock is not None: destination_indices = destination_indices[ frames[destination_indices] <= next_lock @@ -1606,23 +1683,41 @@ def _solve_global_dag( continue end_frames = frames[destination_indices] + inactive_tail_extension_mask = ( + (end_frames == signals.frame_count) + & (end_frames - start_frame > config.maximum_shot_frames) + & inactive_tail_extension_allowed + ) + scoring_durations = durations.copy() + if np.any(inactive_tail_extension_mask): + scoring_durations[inactive_tail_extension_mask] = max( + config.minimum_shot_frames, + active_prefix_frames, + ) + scoring_end_frames = end_frames.copy() + if np.any(inactive_tail_extension_mask): + scoring_end_frames[inactive_tail_extension_mask] = max( + start_frame + config.minimum_shot_frames, + int(inactive_tail_start), + ) segment_intensities = ( - intensity_prefix[end_frames] - intensity_prefix[start_frame] - ) / durations + intensity_prefix[scoring_end_frames] - intensity_prefix[start_frame] + ) / scoring_durations segment_music = ( - music_prefix[end_frames] - music_prefix[start_frame] - ) / durations + music_prefix[scoring_end_frames] - music_prefix[start_frame] + ) / scoring_durations segment_motion = ( - motion_prefix[end_frames] - motion_prefix[start_frame] - ) / durations + motion_prefix[scoring_end_frames] - motion_prefix[start_frame] + ) / scoring_durations target_durations = ( q75 * (1.0 - segment_intensities) + q25 * segment_intensities ) * density_scale duration_costs = -config.duration_prior_weight * duration_log_score[ - durations - 1 + scoring_durations - 1 ] density_costs = config.density_weight * np.square( - (durations - target_durations) / np.maximum(target_durations, 1.0) + (scoring_durations - target_durations) + / np.maximum(target_durations, 1.0) ) for state in tuple(sorted(start_states, key=_beam_state_key)): @@ -1720,6 +1815,15 @@ def _solve_global_dag( "startFrame": start_frame, "endFrame": end_frame, "durationFrames": duration, + "durationScoringFrames": int(scoring_durations[offset]), + "inactiveTailContinuation": bool( + inactive_tail_extension_mask[offset] + ), + "inactiveTailStartFrame": ( + int(inactive_tail_start) + if inactive_tail_extension_mask[offset] + else None + ), "candidateReward": candidate_reward, "heuristicCandidateScore": ( 0.0 if is_endpoint else float(heuristic[end_index]) @@ -1855,6 +1959,16 @@ def _solve_global_dag( "statesExpanded": states_expanded, "statesPruned": states_pruned, }, + "inactiveTail": { + "detected": inactive_tail_start is not None, + "startFrame": inactive_tail_start, + "minimumFrames": config.inactive_tail_minimum_frames, + "signalThreshold": config.inactive_tail_signal_threshold, + "continuationSelected": any( + bool(edge.get("inactiveTailContinuation", False)) + for edge in selected_edges + ), + }, "selectedCuts": selected_cuts, "selectedEdges": selected_edges, "objectiveTotals": objective_totals, @@ -1874,6 +1988,11 @@ def _solve_global_dag( else None ), "sameAudioBoundaryCount": len(same_audio), + "inactiveTailStartFrame": inactive_tail_start, + "inactiveTailContinuationSelected": any( + bool(edge.get("inactiveTailContinuation", False)) + for edge in selected_edges + ), "durationPrior": _duration_prior_summary(prior), "plannerConfig": { name: getattr(config, name) for name in config.__dataclass_fields__ diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py index 4dcb55e..f2b96b2 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py @@ -5,6 +5,7 @@ from __future__ import annotations import argparse import copy +import functools import hashlib import inspect import json @@ -19,7 +20,7 @@ import tempfile import time import uuid from collections import Counter -from dataclasses import dataclass +from dataclasses import asdict, dataclass from pathlib import Path import joblib @@ -84,17 +85,21 @@ MAXIMUM_DIRECTED_REFRAME_DEGREES = 12.0 CAMERA_DIRECTIVE_SCHEMA_VERSION = "camera-directives-v1" HYBRID_METADATA_SCHEMA_VERSION = "3.6" HYBRID_SHOTS_SCHEMA_VERSION = "1.2" +SELECTION_SAFETY_CONTRACT_VERSION = ( + "hybrid-selection-safety-stable-facing-residual-dynamics-" + "post-clamp-kinematics-v2" +) ADJACENT_TRANSITION_EDGE_LIST_SCHEMA_VERSION = ( "authoritative-adjacent-transition-edges-v1" ) HYBRID_SAMPLE_RATE = 60 HYBRID_GENERATION_MODES_BY_PLANNER = { "hierarchical": ( - "hierarchical_hybrid_retarget_v12", + "hierarchical_hybrid_retarget_v13", "hierarchical_hybrid_single_shot_composite_v1", ), "legacy": ( - "legacy_hybrid_retarget_v12", + "legacy_hybrid_retarget_v13", "legacy_hybrid_single_shot_composite_v1", ), } @@ -126,21 +131,26 @@ PREPARATION_LOGIC_CONTRACT_VERSION = ( "hybrid-preparation-logic-v3-complete-rotation-6d" ) CANDIDATE_LOGIC_CONTRACT_VERSION = ( - "hybrid-candidate-logic-v22-causal-aim-final-distance-dynamics-gate" + "hybrid-candidate-logic-v28-post-clamp-kinematic-fail-closed-" + "verified-cut-reference-stable-placement-facing-selection-safety-contract" +) +CUT_REFERENCE_SELECTION_POLICY_VERSION = ( + "production-exact-audio-cut-only-generation-input-v1" ) CANDIDATE_CACHE_STAGE_VERSIONS = { "shotSegmentation": "data-driven-candidates-ranker-global-dag-v1", "shotPlanning": "hierarchical-or-legacy-reconciliation-replay-v3-static-budget", "candidateRanking": ( - "template-rank-v17-c2-position-screen-dynamics-causal-aim-" + "template-rank-v19-c2-position-residual-screen-dynamics-causal-aim-" "adjacent-transition-v3-no-forced-side-alternation" ), "trajectoryRetargeting": ( - "retarget-v24-speed-adaptive-final-radial-audit-dynamics-" - "semantic-causal-jerk-bounded-baked-aim" + "retarget-v26-speed-adaptive-final-radial-post-kinematic-audit-" + "residual-dynamics-semantic-causal-jerk-bounded-baked-aim" ), "compositionSafety": ( - "person-safety-v12-front-facing-fail-closed-dynamics" + "person-safety-v17-full-song-root-calibrated-choreography-facing-" + "fail-closed-residual-dynamics-post-clamp-kinematics" ), "variationPool": ( SEED_VARIATION_POLICY_VERSION @@ -149,20 +159,23 @@ CANDIDATE_CACHE_STAGE_VERSIONS = { "sequenceContinuation": SEED_VARIATION_SEQUENCE_CONTEXT_POLICY, } TRAJECTORY_RETARGETING_VERSION = ( - "c2-position-speed-adaptive-final-radial-step-audit-v12" + "c2-position-speed-adaptive-final-radial-post-kinematic-audit-v14" ) TEMPLATE_MOTION_SMOOTHING_VERSION = ( "savgol61-nearest-edge-step-guard-v1" ) MOTION_SELECTION_VERSION = ( - "non-static-retention-translation-screen-dynamics-yamo-kinematics-v9" + "non-static-retention-residual-screen-tiebreak-yamo-kinematics-v11" ) FINAL_POSITION_SMOOTHING_WINDOW_FRAMES = 15 FINAL_POSITION_SMOOTHING_VERSION = ( "nearest-edge-low-frequency-net-travel-dynamics-guard-v3" ) -TRAJECTORY_DYNAMICS_SELECTION_WEIGHT = 0.65 -TRAJECTORY_DYNAMICS_MAXIMUM_SELECTION_PENALTY = 7.8 +TRAJECTORY_DYNAMICS_SELECTION_WEIGHT = 0.18 +TRAJECTORY_DYNAMICS_MAXIMUM_SELECTION_PENALTY = 0.90 +CANDIDATE_DYNAMICS_HARD_GATE_POLICY_VERSION = ( + "candidate-dynamics-hard-gate-v3-stabilized-screen-residual" +) TRAJECTORY_CATASTROPHIC_MAXIMUM_SPEED_MPS = 12.0 TRAJECTORY_CATASTROPHIC_MAXIMUM_ACCELERATION_MPS2 = 80.0 TRAJECTORY_CATASTROPHIC_MAXIMUM_JERK_MPS3 = 600.0 @@ -220,6 +233,16 @@ FRONT_FACING_ALIGNMENT_MEDIAN_MINIMUM = -0.05 FRONT_FACING_SEVERE_REAR_ALIGNMENT = -0.25 FRONT_FACING_MAXIMUM_SEVERE_REAR_FRAME_RATIO = 0.12 FRONT_FACING_MAXIMUM_SEVERE_REAR_RUN_SECONDS = 0.35 +FRONT_FACING_POLICY_VERSION = ( + "anatomical-strict-full-song-root-calibrated-choreography-turn-v4" +) +FRONT_FACING_STABLE_REFERENCE_MINIMUM_RELIABILITY = 0.60 +FRONT_FACING_STABLE_REFERENCE_MINIMUM_VALID_FRAME_RATIO = 0.95 +FRONT_FACING_STABLE_ALIGNMENT_MEDIAN_MINIMUM = ( + FRONT_FACING_ALIGNMENT_MEDIAN_MINIMUM +) +FRONT_FACING_CHOREOGRAPHY_TURN_DEVIATION_ALIGNMENT = 0.50 +FRONT_FACING_CHOREOGRAPHY_MINIMUM_TURN_FRAME_RATIO = 0.05 AUTOMATIC_LEAD_ROOM_UV = { "wide": 0.06, "medium": 0.052, @@ -1712,18 +1735,102 @@ def longest_true_run(values: np.ndarray) -> int: return maximum +def horizontal_unit_vectors( + values: np.ndarray, +) -> tuple[np.ndarray, np.ndarray]: + horizontal = np.asarray(values, dtype=np.float64).copy() + if horizontal.ndim != 2 or horizontal.shape[1] != 3: + raise ValueError("Horizontal vectors must have shape [frame, 3].") + horizontal[:, 1] = 0.0 + lengths = np.linalg.norm(horizontal, axis=1) + valid = ( + np.isfinite(horizontal).all(axis=1) + & np.isfinite(lengths) + & (lengths > 1e-5) + ) + normalized = np.zeros_like(horizontal) + normalized[valid] = horizontal[valid] / lengths[valid, None] + return normalized, valid + + +def calibrate_front_facing_reference( + root_local_joints: np.ndarray, +) -> dict[str, object]: + """Calibrate one rig-independent local forward from the full target song.""" + + body = np.asarray(root_local_joints, dtype=np.float64) + if ( + body.ndim != 3 + or body.shape[1] < 10 + or body.shape[2] != 3 + or len(body) == 0 + ): + raise ValueError( + "Front-facing calibration requires non-empty canonical root-local " + "joint [frame, joint, 3] data." + ) + anatomical_right = body[:, 9] - body[:, 5] + anatomical_up = body[:, 4] - body[:, 0] + local_forward, valid = horizontal_unit_vectors( + np.cross(anatomical_right, anatomical_up) + ) + valid_ratio = float(np.mean(valid)) + mean_forward = ( + np.mean(local_forward[valid], axis=0) + if np.any(valid) + else np.zeros(3, dtype=np.float64) + ) + mean_forward[1] = 0.0 + reliability = float(np.linalg.norm(mean_forward)) + direction = np.zeros(3, dtype=np.float64) + if math.isfinite(reliability) and reliability > 1e-5: + direction = mean_forward / reliability + alignment = ( + np.sum(local_forward[valid] * direction, axis=1) + if np.any(valid) and np.linalg.norm(direction) > 0.0 + else np.asarray([], dtype=np.float64) + ) + available = bool( + valid_ratio + >= FRONT_FACING_STABLE_REFERENCE_MINIMUM_VALID_FRAME_RATIO + and reliability >= FRONT_FACING_STABLE_REFERENCE_MINIMUM_RELIABILITY + ) + return { + "policyVersion": FRONT_FACING_POLICY_VERSION, + "calibrationScope": "full_target_song", + "available": available, + "frameCount": int(len(body)), + "validFrameRatio": valid_ratio, + "reliability": reliability, + "localForwardDirection": [float(value) for value in direction], + "anatomicalAlignmentMedian": ( + float(np.median(alignment)) if len(alignment) else -1.0 + ), + "anatomicalPositiveFrameRatio": ( + float(np.mean(alignment > 0.0)) if len(alignment) else 0.0 + ), + } + + def front_facing_safety_metrics( camera_positions: np.ndarray, joints: np.ndarray, + root_rotations: np.ndarray | None = None, + *, + root_facing_reference: dict[str, object] | None = None, + semantic_visibility_passed: bool | None = None, sample_rate: float = HYBRID_SAMPLE_RATE, -) -> dict[str, float | int | bool]: +) -> dict[str, object]: """Measure whether a camera remains on the performer's anatomical front. Root transforms are not a dependable facing convention across imported rigs. The signed torso normal derived from labelled left/right shoulders - and pelvis/head is stable across those coordinate-system differences. It - is used only for selection safety; camera motion is never made to follow - this per-frame direction. + and pelvis/head is therefore the strict primary audit. When root rotation + and a full-song root-local calibration is available, that stable reference + may admit a bounded, visible choreography turn. Shot-local calibration is + deliberately forbidden because a turn can cancel its own forward axis. + The exception cannot admit a camera that itself crosses behind the stable + performer front. Camera motion never follows either per-frame direction. """ positions = np.asarray(camera_positions, dtype=np.float64) @@ -1744,26 +1851,26 @@ def front_facing_safety_metrics( if not math.isfinite(sample_rate) or sample_rate <= 0.0: raise ValueError("Front-facing sample_rate must be finite and positive.") + root_values: np.ndarray | None = None + if root_rotations is not None: + root_values = np.asarray(root_rotations, dtype=np.float64) + if root_values.shape != (len(positions), 4): + raise ValueError( + "Front-facing root rotations must have shape [frame, 4]." + ) + anatomical_right = body[:, 9] - body[:, 5] anatomical_up = body[:, 4] - body[:, 0] - anatomical_forward = np.cross(anatomical_right, anatomical_up) - anatomical_forward[:, 1] = 0.0 - camera_offset = positions - body[:, 2] - camera_offset[:, 1] = 0.0 - forward_length = np.linalg.norm(anatomical_forward, axis=1) - offset_length = np.linalg.norm(camera_offset, axis=1) - valid = ( - np.isfinite(anatomical_forward).all(axis=1) - & np.isfinite(camera_offset).all(axis=1) - & (forward_length > 1e-5) - & (offset_length > 1e-5) + anatomical_forward, forward_valid = horizontal_unit_vectors( + np.cross(anatomical_right, anatomical_up) ) + camera_offset, offset_valid = horizontal_unit_vectors( + positions - body[:, 2] + ) + valid = forward_valid & offset_valid alignment = np.full(len(positions), -1.0, dtype=np.float64) alignment[valid] = np.sum( - anatomical_forward[valid] - / forward_length[valid, None] - * camera_offset[valid] - / offset_length[valid, None], + anatomical_forward[valid] * camera_offset[valid], axis=1, ) alignment = np.clip(alignment, -1.0, 1.0) @@ -1777,13 +1884,149 @@ def front_facing_safety_metrics( 1, int(round(FRONT_FACING_MAXIMUM_SEVERE_REAR_RUN_SECONDS * sample_rate)), ) - passed = bool( + strict_anatomical_passed = bool( np.all(valid) and median >= FRONT_FACING_ALIGNMENT_MEDIAN_MINIMUM and severe_ratio <= FRONT_FACING_MAXIMUM_SEVERE_REAR_FRAME_RATIO and severe_longest <= allowed_longest ) + + stable_reference_available = False + stable_reference_reliability = 0.0 + stable_alignment_median = -1.0 + stable_alignment_p10 = -1.0 + stable_alignment_minimum = -1.0 + stable_rear_ratio = 1.0 + stable_severe_ratio = 1.0 + stable_severe_longest = len(positions) + stable_reference_passed = False + turn_deviation_ratio = 0.0 + choreography_turn_detected = False + visibility_confirmed = type(semantic_visibility_passed) is bool and bool( + semantic_visibility_passed + ) + + reference_direction = np.zeros(3, dtype=np.float64) + reference_valid_frame_ratio = 0.0 + if isinstance(root_facing_reference, dict): + direction_value = np.asarray( + root_facing_reference.get("localForwardDirection", []), + dtype=np.float64, + ) + reliability_value = root_facing_reference.get("reliability") + valid_ratio_value = root_facing_reference.get("validFrameRatio") + if ( + direction_value.shape == (3,) + and np.isfinite(direction_value).all() + and isinstance(reliability_value, (int, float)) + and not isinstance(reliability_value, bool) + and math.isfinite(float(reliability_value)) + and isinstance(valid_ratio_value, (int, float)) + and not isinstance(valid_ratio_value, bool) + and math.isfinite(float(valid_ratio_value)) + ): + direction_length = float(np.linalg.norm(direction_value)) + stable_reference_reliability = float(reliability_value) + reference_valid_frame_ratio = float(valid_ratio_value) + if direction_length > 1e-5: + reference_direction = direction_value / direction_length + stable_reference_available = bool( + root_facing_reference.get("available") is True + and root_facing_reference.get("calibrationScope") + == "full_target_song" + and root_facing_reference.get("policyVersion") + == FRONT_FACING_POLICY_VERSION + and stable_reference_reliability + >= FRONT_FACING_STABLE_REFERENCE_MINIMUM_RELIABILITY + and reference_valid_frame_ratio + >= FRONT_FACING_STABLE_REFERENCE_MINIMUM_VALID_FRAME_RATIO + and direction_length > 1e-5 + ) + + if root_values is not None and stable_reference_available: + root_norm = np.linalg.norm(root_values, axis=1) + root_valid = ( + np.isfinite(root_values).all(axis=1) + & np.isfinite(root_norm) + & (root_norm > 1e-5) + ) + normalized_root = np.zeros_like(root_values) + normalized_root[root_valid] = ( + root_values[root_valid] / root_norm[root_valid, None] + ) + stable_forward = train.quat_rotate( + normalized_root, + np.broadcast_to(reference_direction, (len(positions), 3)), + ) + stable_forward, stable_valid = horizontal_unit_vectors(stable_forward) + stable_valid &= valid & root_valid + if np.all(stable_valid): + stable_alignment = np.sum( + stable_forward * camera_offset, + axis=1, + ) + stable_alignment = np.clip( + stable_alignment, + -1.0, + 1.0, + ) + stable_rear = stable_alignment < 0.0 + stable_severe = ( + stable_alignment < FRONT_FACING_SEVERE_REAR_ALIGNMENT + ) + stable_alignment_median = float(np.median(stable_alignment)) + stable_alignment_p10 = float( + np.quantile(stable_alignment, 0.10) + ) + stable_alignment_minimum = float(np.min(stable_alignment)) + stable_rear_ratio = float(np.mean(stable_rear)) + stable_severe_ratio = float(np.mean(stable_severe)) + stable_severe_longest = longest_true_run(stable_severe) + stable_reference_passed = bool( + stable_alignment_median + >= FRONT_FACING_STABLE_ALIGNMENT_MEDIAN_MINIMUM + and stable_severe_ratio + <= FRONT_FACING_MAXIMUM_SEVERE_REAR_FRAME_RATIO + and stable_severe_longest <= allowed_longest + ) + anatomy_to_stable = np.sum( + anatomical_forward * stable_forward, + axis=1, + ) + turn_deviation_ratio = float( + np.mean( + anatomy_to_stable + < FRONT_FACING_CHOREOGRAPHY_TURN_DEVIATION_ALIGNMENT + ) + ) + choreography_turn_detected = bool( + turn_deviation_ratio + >= FRONT_FACING_CHOREOGRAPHY_MINIMUM_TURN_FRAME_RATIO + ) + else: + stable_reference_available = False + + choreography_turn_exception = bool( + not strict_anatomical_passed + and visibility_confirmed + and stable_reference_available + and stable_reference_passed + and choreography_turn_detected + ) + # A reliable full-song reference is authoritative for camera placement. + # This keeps a truly rear camera rejected even if the performer happens to + # turn and face it. Instantaneous anatomy remains a soft preference; its + # strict gate is used only when no reliable calibration is available. + passed = bool( + ( + stable_reference_passed + and (strict_anatomical_passed or choreography_turn_exception) + ) + if stable_reference_available + else strict_anatomical_passed + ) return { + "frontFacingPolicyVersion": FRONT_FACING_POLICY_VERSION, "frontFacingAlignment": median, "frontFacingAlignmentP10": p10, "frontFacingAlignmentMinimum": float(np.min(alignment)), @@ -1792,10 +2035,103 @@ def front_facing_safety_metrics( "frontFacingSevereRearLongestRunFrames": int(severe_longest), "frontFacingSevereRearAllowedLongestRunFrames": int(allowed_longest), "frontFacingInvalidFrameCount": int(np.sum(~valid)), + "frontFacingStrictAnatomicalPassed": strict_anatomical_passed, + "frontFacingStableReferenceAvailable": stable_reference_available, + "frontFacingStableReferenceReliability": float( + stable_reference_reliability + ), + "frontFacingStableReferenceValidFrameRatio": float( + reference_valid_frame_ratio + ), + "frontFacingStableAlignment": stable_alignment_median, + "frontFacingStableAlignmentP10": stable_alignment_p10, + "frontFacingStableAlignmentMinimum": stable_alignment_minimum, + "frontFacingStableRearFrameRatio": stable_rear_ratio, + "frontFacingStableSevereRearFrameRatio": stable_severe_ratio, + "frontFacingStableSevereRearLongestRunFrames": int( + stable_severe_longest + ), + "frontFacingStableReferencePassed": stable_reference_passed, + "frontFacingChoreographyTurnDeviationFrameRatio": ( + turn_deviation_ratio + ), + "frontFacingChoreographyTurnDetected": choreography_turn_detected, + "frontFacingChoreographyVisibilityPassed": visibility_confirmed, + "frontFacingChoreographyTurnExceptionApplied": ( + choreography_turn_exception + ), + "frontFacingGateBasis": ( + "full_song_stable_reference" + if stable_reference_available + else "strict_anatomical_fallback" + ), "frontFacingPassed": passed, } +def front_facing_selection_penalty( + metrics: dict[str, object], + frame_count: int, +) -> float: + """Return a bounded facing tie-break without fighting choreography. + + Once a reliable full-song reference exists, that stable stage-relative + direction is authoritative for camera placement. Instantaneous shoulder + anatomy may turn independently during choreography and must not make a + correct stage-front camera score worse than a profile camera. Outside a + detected turn it remains only a small tie-break. The legacy anatomical + score is retained as the fail-closed fallback when calibration is absent. + """ + + if type(frame_count) is not int or frame_count < 1: + raise ValueError("front-facing penalty frame_count must be positive") + + def finite_metric(name: str) -> float: + value = metrics.get(name) + if not isinstance(value, (int, float)) or isinstance(value, bool): + raise ValueError(f"front-facing metric {name} is invalid") + result = float(value) + if not math.isfinite(result): + raise ValueError(f"front-facing metric {name} is not finite") + return result + + def placement_penalty( + alignment_name: str, + severe_ratio_name: str, + severe_run_name: str, + ) -> float: + return float( + max(0.0, -finite_metric(alignment_name)) * 5.0 + + max(0.0, finite_metric(severe_ratio_name)) * 12.0 + + min( + 1.0, + max(0.0, finite_metric(severe_run_name)) + / float(frame_count), + ) + * 8.0 + ) + + anatomical_penalty = placement_penalty( + "frontFacingAlignment", + "frontFacingSevereRearFrameRatio", + "frontFacingSevereRearLongestRunFrames", + ) + if metrics.get("frontFacingStableReferenceAvailable") is not True: + return anatomical_penalty + + stable_penalty = placement_penalty( + "frontFacingStableAlignment", + "frontFacingStableSevereRearFrameRatio", + "frontFacingStableSevereRearLongestRunFrames", + ) + if metrics.get("frontFacingChoreographyTurnExceptionApplied") is True: + return stable_penalty + + # When anatomy agrees with the stable reference, retain at most a tiny + # deterministic tie-break. It cannot dominate the 2-point quality window. + return float(stable_penalty + min(anatomical_penalty * 0.05, 0.25)) + + def strict_person_envelope_metrics( camera_positions: np.ndarray, camera_rotations: np.ndarray, @@ -2648,12 +2984,12 @@ def build_data_driven_cut_plan( target_record: train.SongRecord, target: train.PreparedSong, beat_onset: preparation_cache.BeatOnsetCache, - planner_records: list[train.SongRecord], + cut_reference_records: list[train.SongRecord], index_entries: dict[str, dict], ) -> tuple[cut_planner.CutPlanResult, dict[str, object]]: corpus = cut_reference.build_cut_reference_corpus( target_record, - planner_records, + cut_reference_records, index_entries, ) duration_prior = cut_planner.EmpiricalDurationPrior.from_duration_frames( @@ -2711,6 +3047,10 @@ def build_data_driven_cut_plan( "density": args.cut_density, "ranker": model_metadata, "referenceCorpus": corpus.as_metadata(), + "referenceSelectionPolicyVersion": ( + CUT_REFERENCE_SELECTION_POLICY_VERSION + ), + "cutReferenceRecordCount": len(cut_reference_records), "sameAudioPriorMode": args.same_audio_prior, "selectedSameAudioPattern": selected_same_audio_metadata, "directivesJson": ( @@ -4800,6 +5140,7 @@ def retarget_template_to_shot( distance_meters: float = 0.0, motion_intensity: float = 1.0, safety_distance_scale: float = 1.0, + front_facing_reference: dict[str, object] | None = None, ) -> dict: if not 0.0 <= motion_intensity <= 2.0: raise ValueError("motion_intensity must be between zero and two.") @@ -5104,6 +5445,300 @@ def retarget_template_to_shot( trajectory_step_after_final_distance_clamp_meters <= MAXIMUM_CAMERA_RELATIVE_POSITION_STEP_METERS + 1e-6 ) + # The radial safety projection is intentionally the last bounding + # transform, but it can bend a curve that was already kinematically + # regularized and recreate a concentrated turn. Audit every motion family + # once more in its authoritative space: orbit around the final stage + # anchor, all other motion in publishable world space. Accept the C2 + # rewrite only when it preserves both the distance annulus and final step + # limit. If it cannot, retain the bounded curve and fail the candidate + # closed when its audit still contains an abrupt or impulsive turn. + pre_clamp_translation_kinematic_metrics = translation_kinematic_metrics + post_clamp_kinematic_safety_rejected = False + post_clamp_kinematic_applied = False + post_clamp_audit_motion_type = ( + realized_motion_type + if declared_kinematic_motion_family == "orbit" + else world_kinematic_motion_type + ) + post_clamp_audit_position = ( + final_relative_position_meters + if declared_kinematic_motion_family == "orbit" + else camera_world_position + ) + ( + post_clamp_regularized_position, + post_clamp_translation_kinematic_metrics, + ) = camera_kinematics.regularize_translational_reversals( + post_clamp_audit_position, + post_clamp_audit_motion_type, + sample_rate=HYBRID_SAMPLE_RATE, + ) + if declared_kinematic_motion_family == "orbit": + post_clamp_relative_position_meters = ( + post_clamp_regularized_position + ) + post_clamp_camera_world_position = ( + stage_anchor_path + post_clamp_relative_position_meters + ) + else: + post_clamp_camera_world_position = ( + post_clamp_regularized_position + ) + post_clamp_relative_position_meters = ( + post_clamp_camera_world_position - stage_anchor_path + ) + post_clamp_distance_meters = np.linalg.norm( + post_clamp_relative_position_meters, + axis=1, + ) + post_clamp_relative_step_meters = ( + float( + np.max( + np.linalg.norm( + np.diff(post_clamp_relative_position_meters, axis=0), + axis=1, + ) + ) + ) + if len(post_clamp_relative_position_meters) > 1 + else 0.0 + ) + post_clamp_bounds_passed = bool( + float(np.min(post_clamp_distance_meters)) + >= smooth_minimum_distance - 1e-6 + and float(np.max(post_clamp_distance_meters)) + <= smooth_maximum_distance + 1e-6 + ) + post_clamp_step_passed = bool( + post_clamp_relative_step_meters + <= MAXIMUM_CAMERA_RELATIVE_POSITION_STEP_METERS + 1e-6 + ) + post_clamp_kinematic_applied = bool( + post_clamp_translation_kinematic_metrics[ + "translationKinematicPolicyApplied" + ] + ) + if post_clamp_bounds_passed and post_clamp_step_passed: + camera_world_position = post_clamp_camera_world_position.astype( + np.float32 + ) + final_relative_position_meters = post_clamp_relative_position_meters + post_clamp_distance_meters = np.linalg.norm( + post_clamp_relative_position_meters, + axis=1, + ) + clamped_distance_meters = post_clamp_distance_meters + trajectory_step_after_final_distance_clamp_meters = ( + post_clamp_relative_step_meters + ) + trajectory_final_relative_step_passed = post_clamp_step_passed + else: + post_clamp_kinematic_safety_rejected = True + ( + _, + post_clamp_translation_kinematic_metrics, + ) = camera_kinematics.regularize_translational_reversals( + post_clamp_audit_position, + post_clamp_audit_motion_type, + sample_rate=HYBRID_SAMPLE_RATE, + apply_policy=False, + ) + + post_stage_regularized_frames = list( + post_clamp_translation_kinematic_metrics[ + "translationRegularizedReversalFrames" + ] + ) + post_stage_direction_reversal_count_after = int( + post_clamp_translation_kinematic_metrics[ + "translationDirectionReversalCountAfter" + ] + ) + post_stage_abrupt_reversal_count_after = int( + post_clamp_translation_kinematic_metrics[ + "translationAbruptReversalCountAfter" + ] + ) + post_stage_impulsive_turn_count_after = int( + post_clamp_translation_kinematic_metrics[ + "translationImpulsiveTurnCountAfter" + ] + ) + + # The top-level contract spans both stages: initial evidence comes from + # the pre-clamp curve, while every After field is the final raw output + # audit. Compact stage summaries retain the causal explanation without + # duplicating the full metric object for every candidate. + translation_kinematic_metrics = post_clamp_translation_kinematic_metrics + for metric_name, metric_value in ( + pre_clamp_translation_kinematic_metrics.items() + ): + if metric_name.endswith("Before"): + translation_kinematic_metrics[metric_name] = metric_value + pre_applied = bool( + pre_clamp_translation_kinematic_metrics[ + "translationKinematicPolicyApplied" + ] + ) + accepted_post_applied = bool( + post_clamp_kinematic_applied + and not post_clamp_kinematic_safety_rejected + ) + translation_kinematic_metrics[ + "translationKinematicPolicyApplied" + ] = bool(pre_applied or accepted_post_applied) + translation_kinematic_metrics[ + "translationKinematicPolicyApplicationEnabled" + ] = True + translation_kinematic_metrics[ + "translationKinematicDynamicsGuardTriggered" + ] = bool( + pre_clamp_translation_kinematic_metrics[ + "translationKinematicDynamicsGuardTriggered" + ] + or post_clamp_translation_kinematic_metrics[ + "translationKinematicDynamicsGuardTriggered" + ] + ) + combined_attempted_frames = list( + dict.fromkeys( + [ + *pre_clamp_translation_kinematic_metrics[ + "translationKinematicAttemptedReversalFrames" + ], + *post_clamp_translation_kinematic_metrics[ + "translationKinematicAttemptedReversalFrames" + ], + ] + ) + ) + translation_kinematic_metrics[ + "translationKinematicAttemptedReversalFrames" + ] = combined_attempted_frames + translation_kinematic_metrics[ + "translationKinematicAttemptedRegularizationCount" + ] = len(combined_attempted_frames) + translation_kinematic_metrics[ + "translationKinematicRegularizationPassCount" + ] = int( + pre_clamp_translation_kinematic_metrics[ + "translationKinematicRegularizationPassCount" + ] + ) + int( + post_clamp_translation_kinematic_metrics[ + "translationKinematicRegularizationPassCount" + ] + ) + translation_kinematic_metrics[ + "translationRegularizedReversalFrames" + ] = list( + dict.fromkeys( + [ + *pre_clamp_translation_kinematic_metrics[ + "translationRegularizedReversalFrames" + ], + *post_clamp_translation_kinematic_metrics[ + "translationRegularizedReversalFrames" + ], + ] + ) + ) + translation_kinematic_metrics[ + "translationRegularizedReversalCount" + ] = len( + translation_kinematic_metrics["translationRegularizedReversalFrames"] + ) + translation_kinematic_metrics[ + "translationRegularizedTurnAnglesDegrees" + ] = [ + *pre_clamp_translation_kinematic_metrics[ + "translationRegularizedTurnAnglesDegrees" + ], + *post_clamp_translation_kinematic_metrics[ + "translationRegularizedTurnAnglesDegrees" + ], + ] + translation_kinematic_metrics[ + "translationRegularizedTargetSpeedRatios" + ] = [ + *pre_clamp_translation_kinematic_metrics[ + "translationRegularizedTargetSpeedRatios" + ], + *post_clamp_translation_kinematic_metrics[ + "translationRegularizedTargetSpeedRatios" + ], + ] + translation_kinematic_metrics[ + "translationImpulsiveTurnRegularizedFrames" + ] = list( + dict.fromkeys( + [ + *pre_clamp_translation_kinematic_metrics[ + "translationImpulsiveTurnRegularizedFrames" + ], + *post_clamp_translation_kinematic_metrics[ + "translationImpulsiveTurnRegularizedFrames" + ], + ] + ) + ) + translation_kinematic_metrics["translationKinematicStagePasses"] = [ + { + "stage": "before_final_radial_clamp", + "policyApplied": pre_applied, + "impulsiveTurnCountBefore": int( + pre_clamp_translation_kinematic_metrics[ + "translationImpulsiveTurnCountBefore" + ] + ), + "regularizedFrames": list( + pre_clamp_translation_kinematic_metrics[ + "translationRegularizedReversalFrames" + ] + ), + "directionReversalCountAfter": int( + pre_clamp_translation_kinematic_metrics[ + "translationDirectionReversalCountAfter" + ] + ), + }, + { + "stage": "after_final_radial_clamp", + "policyApplied": accepted_post_applied, + "safetyRejected": post_clamp_kinematic_safety_rejected, + "regularizedFrames": post_stage_regularized_frames, + "directionReversalCountAfter": ( + post_stage_direction_reversal_count_after + ), + "abruptReversalCountAfter": ( + post_stage_abrupt_reversal_count_after + ), + "impulsiveTurnCountAfter": post_stage_impulsive_turn_count_after, + }, + ] + translation_kinematic_detection_space = ( + "final_camera_relative_position_post_radial_audit" + if declared_kinematic_motion_family == "orbit" + else "final_world_position_post_radial_audit" + ) + trajectory_step_after_kinematic_meters = ( + trajectory_step_after_final_distance_clamp_meters + ) + final_post_clamp_kinematic_passed = bool( + int( + post_clamp_translation_kinematic_metrics[ + "translationAbruptReversalCountAfter" + ] + ) + == 0 + and int( + post_clamp_translation_kinematic_metrics[ + "translationImpulsiveTurnCountAfter" + ] + ) + == 0 + ) final_distance_bounds_passed = bool( float(np.min(clamped_distance_meters)) >= smooth_minimum_distance - 1e-6 @@ -5115,7 +5750,20 @@ def retarget_template_to_shot( radial_distance_clamp_metrics = { **final_radial_distance_clamp_metrics, "initialPass": initial_radial_distance_clamp_metrics, - "finalPassAfterAllPositionTransforms": True, + "finalPassAfterAllPositionTransforms": bool( + not post_clamp_kinematic_applied + or post_clamp_kinematic_safety_rejected + ), + "postClampKinematicAuditExecuted": True, + "postClampKinematicPolicyApplied": bool( + post_clamp_kinematic_applied + and not post_clamp_kinematic_safety_rejected + ), + "postClampKinematicSafetyRejected": ( + post_clamp_kinematic_safety_rejected + ), + "finalPostClampKinematicPassed": final_post_clamp_kinematic_passed, + "finalDistanceAuditAfterAllPositionTransforms": True, "finalDistanceBoundsPassed": final_distance_bounds_passed, "finalRelativeStepMetersBeforeClamp": ( trajectory_step_before_final_distance_clamp_meters @@ -5136,10 +5784,15 @@ def retarget_template_to_shot( "translationKinematicDetectionSpace": ( translation_kinematic_detection_space ), - "translationKinematicPassCount": 1, + "translationKinematicPassCount": ( + 2 + ), "translationRelativeKinematicPassExecuted": ( relative_kinematic_pass_executed ), + "finalPostClampKinematicPassed": ( + final_post_clamp_kinematic_passed + ), } ) camera_world_rotation = train.quat_multiply( @@ -5545,18 +6198,21 @@ def retarget_template_to_shot( motion_quality["motionSelectionAdjustment"] + translation_kinematic_penalty ) + screen_residual_uv = stabilized_screen_residual( + final_composition, + semantic_desired_composition, + ) candidate_dynamics = trajectory_quality.evaluate_candidate_dynamics( camera_world_position, - np.asarray(final_composition, dtype=np.float64)[:, :2], + screen_residual_uv, sample_rate=HYBRID_SAMPLE_RATE, - ) - candidate_dynamics_penalty = min( - float(candidate_dynamics["cost"]), - ( - TRAJECTORY_DYNAMICS_MAXIMUM_SELECTION_PENALTY - / TRAJECTORY_DYNAMICS_SELECTION_WEIGHT + screen_input_kind=( + trajectory_quality.STABILIZED_SCREEN_RESIDUAL_INPUT ), - ) * TRAJECTORY_DYNAMICS_SELECTION_WEIGHT + ) + candidate_dynamics_penalty = candidate_dynamics_selection_penalty( + float(candidate_dynamics["cost"]) + ) translation_dynamics = candidate_dynamics["translationMetrics"] screen_dynamics = candidate_dynamics["screenSpaceMetrics"] candidate_dynamics_hard_gate_result = candidate_dynamics_hard_gate( @@ -5589,16 +6245,16 @@ def retarget_template_to_shot( front_facing = front_facing_safety_metrics( camera_world_position, joint_world_position, + root_rotation, + root_facing_reference=front_facing_reference, + semantic_visibility_passed=bool( + strict_safety["hardPersonSafetyPassed"] + and strict_safety["semanticProjectionSafetyPassed"] + ), ) - front_facing_penalty = ( - max(0.0, -float(front_facing["frontFacingAlignment"])) * 5.0 - + float(front_facing["frontFacingSevereRearFrameRatio"]) * 12.0 - + min( - 1.0, - float(front_facing["frontFacingSevereRearLongestRunFrames"]) - / max(1.0, float(len(camera_world_position))), - ) - * 8.0 + front_facing_penalty = front_facing_selection_penalty( + front_facing, + len(camera_world_position), ) quality_score += front_facing_penalty transition_state = adjacent_transition.build_transition_state( @@ -5627,6 +6283,7 @@ def retarget_template_to_shot( "candidateDynamicsCatastrophicPassed": ( candidate_dynamics_catastrophic_passed ), + "finalPostClampKinematicPassed": final_post_clamp_kinematic_passed, "trajectoryLimitScale": float(trajectory_scale), "trajectoryVelocityLimitScale": float( trajectory_velocity_limit_scale @@ -5894,6 +6551,54 @@ def _camera_variation_sort_key(result: dict) -> tuple: ) +def stabilized_screen_residual( + projected_composition: object, + desired_composition: object, +) -> np.ndarray: + """Return the semantic-focus residual used for screen dynamics. + + Raw projected subject UV contains choreography. Candidate dynamics must + instead measure how far the rendered semantic focus departs from the + stabilized desired UV path, so a dancer can move energetically without + being mistaken for a camera-body impulse. + """ + + projected = np.asarray(projected_composition, dtype=np.float64) + desired = np.asarray(desired_composition, dtype=np.float64) + if ( + projected.ndim != 2 + or desired.ndim != 2 + or projected.shape[1] < 2 + or desired.shape[1] < 2 + or len(projected) == 0 + or len(projected) != len(desired) + ): + raise ValueError( + "projected and desired composition must have matching non-empty " + "[frame, component>=2] shapes" + ) + residual = projected[:, :2] - desired[:, :2] + if not np.all(np.isfinite(residual)): + raise ValueError("stabilized screen residual must be finite") + return residual + + +def candidate_dynamics_selection_penalty(cost: object) -> float: + """Bound soft dynamics to a tie-break without weakening hard safety.""" + + if not isinstance(cost, (int, float)) or isinstance(cost, bool): + raise ValueError("candidate dynamics cost must be a finite number") + value = float(cost) + if not math.isfinite(value) or value < 0.0: + raise ValueError("candidate dynamics cost must be finite and non-negative") + return float( + min( + value * TRAJECTORY_DYNAMICS_SELECTION_WEIGHT, + TRAJECTORY_DYNAMICS_MAXIMUM_SELECTION_PENALTY, + ) + ) + + def candidate_dynamics_hard_gate( translation_metrics: object, screen_metrics: object, @@ -5902,10 +6607,13 @@ def candidate_dynamics_hard_gate( ) -> dict[str, object]: """Evaluate the fail-closed final camera dynamics contract. - Percentiles keep ranking tolerant of harmless numerical noise, but a - single rendered-frame impulse is still visible. The hard gate therefore - checks both p99 and maxima, as well as the actual post-distance-clamp - relative step. Missing, non-finite, or non-boolean audit data fails closed. + Translation metrics audit the final world camera. Screen metrics audit the + stabilized semantic-focus residual, rather than raw performer UV, so + choreography cannot cause a false hard rejection. Percentiles keep ranking + tolerant of harmless numerical noise, but a single rendered-frame impulse + is still visible. The hard gate therefore checks both p99 and maxima, as + well as the actual post-distance-clamp relative step. Missing, non-finite, + or non-boolean audit data fails closed. """ def finite_metric( @@ -5993,7 +6701,7 @@ def candidate_dynamics_hard_gate( and final_relative_step_passed ) return { - "policyVersion": "candidate-dynamics-hard-gate-v2", + "policyVersion": CANDIDATE_DYNAMICS_HARD_GATE_POLICY_VERSION, "observed": observed, "thresholds": thresholds, "checks": checks, @@ -6022,6 +6730,9 @@ def candidate_passes_safety_and_aim(candidate: dict) -> bool: catastrophic_passed = candidate.get( "candidateDynamicsCatastrophicPassed" ) + final_post_clamp_kinematic_passed = candidate.get( + "finalPostClampKinematicPassed" + ) return bool( composition.get("hardPersonSafetyPassed", False) and composition.get("aimQualityPassed", True) @@ -6036,6 +6747,10 @@ def candidate_passes_safety_and_aim(candidate: dict) -> bool: and type(catastrophic_passed) is bool and catastrophic_passed and dynamics_passed == catastrophic_passed + # This field is deliberately fail-closed. Older candidate caches did + # not audit the curve after radial projection and must be rebuilt. + and type(final_post_clamp_kinematic_passed) is bool + and final_post_clamp_kinematic_passed ) @@ -6348,6 +7063,7 @@ def evaluate_safe_candidate_pool( previous_transition_state: dict[str, object] | None = None, next_transition_state: dict[str, object] | None = None, cached_base_candidate_results: list[dict] | None = None, + front_facing_reference: dict[str, object] | None = None, ) -> tuple[list[dict], list[dict]]: """Retarget a deterministic base plus lazy selection-only transition ranks. @@ -6390,6 +7106,7 @@ def evaluate_safe_candidate_pool( distance_meters=control.distance_meters, motion_intensity=effective_motion_intensity, safety_distance_scale=safety_distance_scale, + front_facing_reference=front_facing_reference, ) candidate_result["candidateRank"] = candidate_rank candidate_result["selectionScore"] = candidate_selection_score( @@ -6622,15 +7339,314 @@ def generation_data_inputs( return values +def target_reference_evaluation_group( + entries: dict[str, dict], + target_record: train.SongRecord, +) -> str | None: + """Return the indexed logical-song group used only for leakage exclusion. + + A camera-free generation input is never itself a training-index member. + It can nevertheless share the legacy logical ``SongRecord.id`` with an + authored record from the same scene. That collision remains useful for + excluding the authored evaluation group from trajectory/planner fitting, + but must not turn the camera-free input into an authored target. + """ + + entry = entries.get(target_record.id) + if entry is None or not str(entry.get("evaluationGroupId", "")).strip(): + return None + return str(entry["evaluationGroupId"]) + + +def normalized_audio_sha256(value: object, label: str) -> str | None: + """Validate an optional SHA-256 audio identity without guessing.""" + + normalized = str(value or "").strip().lower() + if not normalized: + return None + if len(normalized) != 64 or any( + character not in "0123456789abcdef" for character in normalized + ): + raise ValueError(f"{label} must be a lowercase SHA-256 fingerprint.") + return normalized + + +@functools.lru_cache(maxsize=1024) +def _cached_file_sha256( + resolved_path: str, + size: int, + modified_nanoseconds: int, +) -> str: + del size, modified_nanoseconds + return sha256_file(Path(resolved_path)) + + +def cached_file_sha256(path: Path) -> str: + """Hash an immutable generation input once per worker process.""" + + resolved = Path(path).resolve() + stat_result = resolved.stat() + return _cached_file_sha256( + str(resolved), + int(stat_result.st_size), + int(stat_result.st_mtime_ns), + ) + + +def verified_exact_audio_fingerprint( + record: train.SongRecord, + indexed_entry: dict | None, + *, + fail_on_disagreement: bool = False, +) -> str | None: + """Cross-check all available actual, declared, and indexed audio IDs. + + Raw audio is authoritative when it is packaged. Portable libraries may + deliberately omit it, in which case matching manifest and index hashes are + sufficient. Any disagreement excludes the record from the exact-audio + exception; generic duration/cut priors remain available. + """ + + declared = normalized_audio_sha256( + record.song.get("audioFingerprint"), + f"Declared audio fingerprint for {record.id}", + ) + indexed = ( + normalized_audio_sha256( + indexed_entry.get("audioFingerprint"), + f"Indexed audio fingerprint for {record.id}", + ) + if isinstance(indexed_entry, dict) + else None + ) + actual = ( + cached_file_sha256(record.audio_path) + if record.audio_path.is_file() + else None + ) + evidence = [ + fingerprint + for fingerprint in (actual, declared, indexed) + if fingerprint is not None + ] + if len(set(evidence)) > 1: + if fail_on_disagreement: + raise ValueError( + "Audio fingerprint evidence disagrees for generation target " + f"{record.id}; re-export the Timeline input before generation." + ) + return None + if not evidence: + return None + if indexed_entry is not None and indexed is None: + return None + if actual is None and declared is None: + return None + return evidence[0] + + +def authored_record_equivalence_fingerprint( + record: train.SongRecord, +) -> str | None: + """Identify complete duplicate exports by the bytes generation consumes.""" + + raw_file_paths = { + "audio": record.audio_path, + "joints": record.song_dir / "joints_world.f32", + "root": record.song_dir / "root.f32", + "camera": record.song_dir / "camera.f32", + "shotIndex": record.song_dir / "shot_index.i32", + "time": record.song_dir / "time.f64", + "shots": record.song_dir / str(record.song.get("shotsFile", "shots.json")), + } + if all(path.is_file() for path in raw_file_paths.values()): + representation = "raw-v1" + file_paths = raw_file_paths + else: + portable_file_paths = { + "prepared": record.portable_prepared_path, + "shots": record.song_dir + / str(record.song.get("shotsFile", "shots.json")), + } + if any(not path.is_file() for path in portable_file_paths.values()): + return None + representation = "portable-v1" + file_paths = portable_file_paths + if not file_paths: + return None + identity = { + "representation": representation, + "songId": record.id, + "songName": record.name, + "sampleRate": record.song.get( + "sampleRate", + record.manifest.get("sampleRate"), + ), + "frameCount": record.song.get("frameCount"), + "audioStart": record.song.get("audioStart"), + "audioDuration": record.song.get("audioDuration"), + "sampleStart": record.song.get("sampleStart"), + "sampleEndExclusive": record.song.get("sampleEndExclusive"), + "shotCount": record.song.get("shotCount"), + "sharedBoneCount": record.song.get("sharedBoneCount"), + "sharedBones": record.manifest.get("sharedBones"), + "audioFingerprint": record.song.get("audioFingerprint"), + "files": { + name: cached_file_sha256(path) + for name, path in sorted(file_paths.items()) + }, + } + return candidate_cache.fingerprint_value(identity) + + +def is_index_authoritative_portable_record( + record: train.SongRecord, + indexed_entry: dict | None, +) -> bool: + """Recognize the indexed portable derivative of an authored export. + + RuntimeData intentionally replaces the large raw arrays with prepared + inference data, so it cannot be byte-identical to the source export. It + is authoritative only when its dataset/folder metadata and declared audio + identity agree with the training index and the prepared payload exists. + """ + + if not isinstance(indexed_entry, dict): + return False + if str(indexed_entry.get("datasetId", "")) != record.dataset_id: + return False + indexed_folder = str(indexed_entry.get("folder", "")).replace("\\", "/") + expected_folder = f"{record.dataset_id}/{record.song['folderName']}" + if indexed_folder and indexed_folder != expected_folder: + return False + indexed_name = str(indexed_entry.get("songName", "")) + if indexed_name and indexed_name != record.name: + return False + for field in ("frameCount", "shotCount"): + if field in indexed_entry and int(indexed_entry[field]) != int( + record.song.get(field, -1) + ): + return False + if not record.portable_prepared_path.is_file(): + return False + declared = normalized_audio_sha256( + record.song.get("audioFingerprint"), + f"Declared audio fingerprint for {record.id}", + ) + indexed = normalized_audio_sha256( + indexed_entry.get("audioFingerprint"), + f"Indexed audio fingerprint for {record.id}", + ) + return declared is not None and declared == indexed + + +def available_authored_records_by_id( + records: list[train.SongRecord], + entries: dict[str, dict] | None = None, +) -> dict[str, train.SongRecord]: + """Return unambiguous authored exports without data-root last-win. + + A packaged RuntimeData derivative may coexist with its raw project export. + The indexed portable copy wins only after every duplicate's available + audio evidence agrees with that same index entry. All other divergent or + incomplete duplicate groups fail closed. + """ + + grouped: dict[str, dict[tuple[str, str], train.SongRecord]] = {} + for record in records: + if record.is_generation_input: + continue + physical_identity = ( + str(record.manifest_path.resolve()), + str(record.song.get("folderName", "")), + ) + grouped.setdefault(record.id, {})[physical_identity] = record + + selected: dict[str, train.SongRecord] = {} + ambiguous: dict[str, list[str]] = {} + for song_id, physical_records in grouped.items(): + candidates = list(physical_records.values()) + if len(candidates) == 1: + selected[song_id] = candidates[0] + continue + indexed_entry = entries.get(song_id) if entries is not None else None + authoritative_portable = [ + record + for record in candidates + if is_index_authoritative_portable_record(record, indexed_entry) + ] + portable_group_verified = False + if authoritative_portable: + verified_audio = [ + verified_exact_audio_fingerprint(record, indexed_entry) + for record in candidates + ] + indexed_audio = normalized_audio_sha256( + indexed_entry.get("audioFingerprint"), + f"Indexed audio fingerprint for {song_id}", + ) + portable_group_verified = indexed_audio is not None and all( + fingerprint == indexed_audio + for fingerprint in verified_audio + ) + if portable_group_verified and len(authoritative_portable) == 1: + selected[song_id] = authoritative_portable[0] + continue + equivalence_candidates = ( + authoritative_portable + if portable_group_verified and len(authoritative_portable) > 1 + else candidates + ) + fingerprints = [ + authored_record_equivalence_fingerprint(record) + for record in equivalence_candidates + ] + if fingerprints[0] is None or any( + fingerprint != fingerprints[0] + for fingerprint in fingerprints[1:] + ): + ambiguous[song_id] = sorted( + f"{record.dataset_id}:{record.manifest_path}" + for record in candidates + ) + continue + selected[song_id] = sorted( + equivalence_candidates, + key=lambda record: ( + not record.portable_prepared_path.is_file(), + not ( + bool(record.song.get("audioFile")) + and record.audio_path.is_file() + ), + str(record.manifest_path.resolve()), + ), + )[0] + if ambiguous: + raise ValueError( + "Duplicate authored song IDs are ambiguous across data roots; " + "remove the duplicate export or rebuild one authoritative library: " + + json.dumps(ambiguous, ensure_ascii=False, sort_keys=True) + ) + return selected + + def select_generation_records( records: list[train.SongRecord], entries: dict[str, dict], target_record: train.SongRecord, library_split: str, ) -> tuple[list[train.SongRecord], list[train.SongRecord], dict | None, int]: - """Select a train-only library and exclude every target-group sibling.""" + """Select leakage-safe trajectory and planner libraries. - target_entry = entries.get(target_record.id) + Exact-audio cut references are selected separately because production may + use authored edit timing without admitting the same record's camera path + into either model/template pool. + """ + + indexed_collision_entry = entries.get(target_record.id) + target_entry = ( + None if target_record.is_generation_input else indexed_collision_entry + ) target_is_unindexed_generation_input = ( target_entry is None and target_record.is_generation_input ) @@ -6640,12 +7656,8 @@ def select_generation_records( "the training index. Only an explicit camera-free " "inputKind='generation_input' target may be unindexed." ) - target_group = ( - str(target_entry["evaluationGroupId"]) - if target_entry is not None - else None - ) - available_by_id = {record.id: record for record in records} + target_group = target_reference_evaluation_group(entries, target_record) + available_by_id = available_authored_records_by_id(records, entries) target_group_available = ( sum( entry.get("evaluationGroupId") == target_group @@ -6661,10 +7673,6 @@ def select_generation_records( for song_id, record in available_by_id.items(): if song_id == target_record.id: continue - # Other exported motion/audio targets under the same DatasetExports - # parent are neither authored-camera references nor index members. - if record.is_generation_input: - continue entry = entries.get(song_id) if entry is None: raise ValueError( @@ -6705,6 +7713,95 @@ def select_generation_records( ) +def select_cut_reference_records( + records: list[train.SongRecord], + entries: dict[str, dict], + target_record: train.SongRecord, + library_split: str, + *, + allow_exact_audio_prior: bool, +) -> list[train.SongRecord]: + """Select cut-only references under an explicit production exception. + + The baseline follows the same ID/group/split exclusions as trajectory and + planner selection. A production camera-free request may then add back an + approved primary ``cutModel`` record with the exact target audio. The + returned records are used only for authored boundaries and duration priors; + they never enter prepared camera templates or planner fitting. + """ + + available_by_id = available_authored_records_by_id(records, entries) + target_group = target_reference_evaluation_group(entries, target_record) + selected: dict[str, train.SongRecord] = {} + + for song_id, record in available_by_id.items(): + entry = entries.get(song_id) + if entry is None: + raise ValueError( + f"Available cut reference {song_id} is missing from the " + "training index." + ) + usage = entry.get("usage", {}) + if entry.get("role") != "primary" or usage.get("cutModel") is not True: + continue + if song_id == target_record.id: + continue + if ( + target_group is not None + and str(entry["evaluationGroupId"]) == target_group + ): + continue + if library_split == "train" and entry["recommendedSplit"] != "train": + continue + selected[song_id] = record + + if ( + allow_exact_audio_prior + and library_split == "all" + and target_record.is_generation_input + ): + target_audio_fingerprint = verified_exact_audio_fingerprint( + target_record, + None, + fail_on_disagreement=True, + ) + indexed_target_collision = entries.get(target_record.id) + if indexed_target_collision is not None: + target_audio_fingerprint = verified_exact_audio_fingerprint( + target_record, + indexed_target_collision, + ) + if target_audio_fingerprint is not None: + for song_id, record in available_by_id.items(): + entry = entries.get(song_id) + if entry is None: + continue + usage = entry.get("usage", {}) + indexed_audio_fingerprint = normalized_audio_sha256( + entry.get("audioFingerprint"), + f"Indexed audio fingerprint for {song_id}", + ) + if ( + entry.get("role") != "primary" + or usage.get("cutModel") is not True + or indexed_audio_fingerprint != target_audio_fingerprint + ): + continue + record_audio_fingerprint = verified_exact_audio_fingerprint( + record, + entry, + ) + if record_audio_fingerprint == target_audio_fingerprint: + selected[song_id] = record + else: + # A baseline generic record whose stale index happens to + # claim this audio must not re-enter as a same-audio pattern + # when the corpus is assembled from index metadata. + selected.pop(song_id, None) + + return sorted(selected.values(), key=lambda item: item.id) + + def aspect_for_entry( entry: dict, override: float = 0.0, @@ -7004,6 +8101,10 @@ def decode_candidate_pool_shot( "Candidate metrics must be an object." ) metrics = dict(cached_candidate.metrics) + if type(metrics.get("finalPostClampKinematicPassed")) is not bool: + raise candidate_cache.CandidateCacheIntegrityError( + "Candidate final post-clamp kinematic audit is missing or invalid." + ) identity = metrics.pop("templateIdentity", None) if not isinstance(identity, dict): raise candidate_cache.CandidateCacheIntegrityError( @@ -7418,6 +8519,16 @@ def load_base_generation_composite( "Base generation metadata schema " f"{HYBRID_METADATA_SCHEMA_VERSION} is required." ) + metadata_safety_contract = metadata.get( + "selectionSafetyContractVersion" + ) + if metadata_safety_contract != SELECTION_SAFETY_CONTRACT_VERSION: + raise ValueError( + "Base generation uses an incompatible or legacy selection-safety " + "contract. Run full camera generation once before regenerating " + "an individual shot. Required contract: " + + SELECTION_SAFETY_CONTRACT_VERSION + ) supported_modes = HYBRID_GENERATION_MODES_BY_PLANNER.get( expected_planner_mode ) @@ -7463,6 +8574,14 @@ def load_base_generation_composite( "Base generation shots schema " f"{HYBRID_SHOTS_SCHEMA_VERSION} is required." ) + if shots_payload.get( + "selectionSafetyContractVersion" + ) != SELECTION_SAFETY_CONTRACT_VERSION: + raise ValueError( + "Base generation shot trace uses an incompatible or legacy " + "selection-safety contract. Run full camera generation once " + "before regenerating an individual shot." + ) if metadata.get("songId") != expected_song_id: raise ValueError("Base generation songId does not match the target.") if metadata.get("datasetId") != expected_dataset_id: @@ -8031,7 +9150,7 @@ def validate_loaded_candidate_pool( metadata = loaded.bundle_metadata if ( not isinstance(metadata, dict) - or metadata.get("contractVersion") != "hybrid-candidate-runtime-v9" + or metadata.get("contractVersion") != "hybrid-candidate-runtime-v10" or metadata.get("cutBoundaries") != boundaries ): raise candidate_cache.CandidateCacheIntegrityError( @@ -8796,10 +9915,9 @@ def publish_preparation_cache_after_miss( summary = { "targetSongId": target_record.id, "targetDatasetId": target_record.dataset_id, - "targetEvaluationGroupId": ( - target_entry.get("evaluationGroupId") - if target_entry is not None - else None + "targetEvaluationGroupId": target_reference_evaluation_group( + index_entries, + target_record, ), "targetTrainingIndexMembership": target_entry is not None, "targetInputKind": ( @@ -8878,6 +9996,17 @@ def main() -> None: target_record, args.library_split, ) + cut_reference_records = ( + select_cut_reference_records( + records, + index_entries, + target_record, + args.library_split, + allow_exact_audio_prior=args.same_audio_prior == "auto", + ) + if args.cut_planner == "data_driven" + else [] + ) target_aspect_policy = target_entry or { "aspectRatio": target_record.song.get( "aspectRatio", @@ -8984,10 +10113,9 @@ def main() -> None: ) else: templates = cached_preparation.templates - target_evaluation_group = ( - str(target_entry["evaluationGroupId"]) - if target_entry is not None - else None + target_evaluation_group = target_reference_evaluation_group( + index_entries, + target_record, ) planner_record_ids = {record.id for record in planner_records} planner_templates = [ @@ -9095,7 +10223,7 @@ def main() -> None: target_record, target, beat_onset, - planner_records, + cut_reference_records, index_entries, ) boundaries = list(cut_plan_result.boundaries) @@ -9209,6 +10337,7 @@ def main() -> None: if base_generation is not None: validate_base_generation_times(base_generation, times) joints = target.inputs[:, :63].reshape(frame_count, 21, 3) + front_facing_reference = calibrate_front_facing_reference(joints) world_camera = ( base_generation.world_camera.copy() if base_generation is not None @@ -9764,6 +10893,7 @@ def main() -> None: cached_base_candidate_results=( cached_runtime_shot.candidate_results ), + front_facing_reference=front_facing_reference, ) variation_pool = cached_runtime_shot.variation_pool elif cached_runtime_shot is not None: @@ -9791,6 +10921,7 @@ def main() -> None: planned_non_static_required, previous_transition_state=previous_transition_state, next_transition_state=next_transition_state, + front_facing_reference=front_facing_reference, ) base_candidate_results = cache_eligible_candidate_results( candidate_results @@ -9859,6 +10990,18 @@ def main() -> None: ), ), ) + best_stable_front = max( + candidate_results, + key=lambda result: ( + float(result.get("frontFacingStableAlignment", -1.0)), + -float( + result.get( + "frontFacingStableSevereRearFrameRatio", + 1.0, + ) + ), + ), + ) raise ValueError( f"Shot {shot_index} failed the camera safety gates" + ( @@ -9883,7 +11026,17 @@ def main() -> None: "bestFrontAlignment=" f"{float(best_front.get('frontFacingAlignment', -1.0)):.6f}, " "bestSevereRearRatio=" - f"{float(best_front.get('frontFacingSevereRearFrameRatio', 1.0)):.6f}." + f"{float(best_front.get('frontFacingSevereRearFrameRatio', 1.0)):.6f}, " + "bestStableFrontAlignment=" + f"{float(best_front.get('frontFacingStableAlignment', -1.0)):.6f}, " + "bestChoreographyTurnException=" + f"{bool(best_front.get('frontFacingChoreographyTurnExceptionApplied', False))}, " + "bestStableCandidateAlignment=" + f"{float(best_stable_front.get('frontFacingStableAlignment', -1.0)):.6f}, " + "bestStableCandidateAnatomicalAlignment=" + f"{float(best_stable_front.get('frontFacingAlignment', -1.0)):.6f}, " + "bestStableCandidateSevereRearRatio=" + f"{float(best_stable_front.get('frontFacingSevereRearFrameRatio', 1.0)):.6f}." ) planner_variation_pool = ( @@ -10341,6 +11494,65 @@ def main() -> None: "frontFacingInvalidFrameCount": selected_result[ "frontFacingInvalidFrameCount" ], + "frontFacingPolicyVersion": selected_result[ + "frontFacingPolicyVersion" + ], + "frontFacingStrictAnatomicalPassed": selected_result[ + "frontFacingStrictAnatomicalPassed" + ], + "frontFacingStableReferenceAvailable": selected_result[ + "frontFacingStableReferenceAvailable" + ], + "frontFacingStableReferenceReliability": selected_result[ + "frontFacingStableReferenceReliability" + ], + "frontFacingStableReferenceValidFrameRatio": ( + selected_result[ + "frontFacingStableReferenceValidFrameRatio" + ] + ), + "frontFacingStableAlignment": selected_result[ + "frontFacingStableAlignment" + ], + "frontFacingStableAlignmentP10": selected_result[ + "frontFacingStableAlignmentP10" + ], + "frontFacingStableAlignmentMinimum": selected_result[ + "frontFacingStableAlignmentMinimum" + ], + "frontFacingStableRearFrameRatio": selected_result[ + "frontFacingStableRearFrameRatio" + ], + "frontFacingStableSevereRearFrameRatio": selected_result[ + "frontFacingStableSevereRearFrameRatio" + ], + "frontFacingStableSevereRearLongestRunFrames": ( + selected_result[ + "frontFacingStableSevereRearLongestRunFrames" + ] + ), + "frontFacingStableReferencePassed": selected_result[ + "frontFacingStableReferencePassed" + ], + "frontFacingChoreographyTurnDeviationFrameRatio": ( + selected_result[ + "frontFacingChoreographyTurnDeviationFrameRatio" + ] + ), + "frontFacingChoreographyTurnDetected": selected_result[ + "frontFacingChoreographyTurnDetected" + ], + "frontFacingChoreographyVisibilityPassed": selected_result[ + "frontFacingChoreographyVisibilityPassed" + ], + "frontFacingGateBasis": selected_result[ + "frontFacingGateBasis" + ], + "frontFacingChoreographyTurnExceptionApplied": ( + selected_result[ + "frontFacingChoreographyTurnExceptionApplied" + ] + ), "frontFacingPassed": selected_result["frontFacingPassed"], "frontFacingPenalty": selected_result["frontFacingPenalty"], "candidateCountEvaluated": len(candidate_results), @@ -10436,7 +11648,7 @@ def main() -> None: candidate_identity, candidate_pool_shots, bundle_metadata={ - "contractVersion": "hybrid-candidate-runtime-v9", + "contractVersion": "hybrid-candidate-runtime-v10", "cutBoundaries": [int(value) for value in boundaries], "planningReplay": [ { @@ -10611,6 +11823,9 @@ def main() -> None: json.dumps( { "schemaVersion": HYBRID_SHOTS_SCHEMA_VERSION, + "selectionSafetyContractVersion": ( + SELECTION_SAFETY_CONTRACT_VERSION + ), "shots": shots, "adjacentTransitionSchemaVersion": ( ADJACENT_TRANSITION_EDGE_LIST_SCHEMA_VERSION @@ -10731,14 +11946,17 @@ def main() -> None: metadata = { "schemaVersion": HYBRID_METADATA_SCHEMA_VERSION, + "selectionSafetyContractVersion": ( + SELECTION_SAFETY_CONTRACT_VERSION + ), "generationMode": ( "hierarchical_hybrid_single_shot_composite_v1" if single_shot_mode and args.planner == "hierarchical" else "legacy_hybrid_single_shot_composite_v1" if single_shot_mode - else "hierarchical_hybrid_retarget_v12" + else "hierarchical_hybrid_retarget_v13" if args.planner == "hierarchical" - else "legacy_hybrid_retarget_v12" + else "legacy_hybrid_retarget_v13" ), "songName": target.name, "songId": target_record.id, @@ -11027,6 +12245,16 @@ def main() -> None: trajectory_quality.RADIAL_CLAMP_POLICY_VERSION ), "dynamicsVersion": trajectory_quality.DYNAMICS_POLICY_VERSION, + "screenInputKind": ( + trajectory_quality.STABILIZED_SCREEN_RESIDUAL_INPUT + ), + "screenInputSemantics": ( + "projected semantic-focus UV minus stabilized desired UV" + ), + "softCostPolicy": asdict( + trajectory_quality.CandidateDynamicsPolicy() + ), + "softSelectionRole": "bounded_tiebreak", "finalPositionSmoothingVersion": ( FINAL_POSITION_SMOOTHING_VERSION ), @@ -11058,7 +12286,9 @@ def main() -> None: "finalRelativeStepMeters": ( MAXIMUM_CAMERA_RELATIVE_POSITION_STEP_METERS ), - "hardGatePolicyVersion": "candidate-dynamics-hard-gate-v2", + "hardGatePolicyVersion": ( + CANDIDATE_DYNAMICS_HARD_GATE_POLICY_VERSION + ), }, "trajectoryOffsetLimitsMeters": dict( TRAJECTORY_OFFSET_LIMITS_METERS @@ -11112,13 +12342,24 @@ def main() -> None: camera_kinematics.DEFAULT_REVERSAL_WINDOW_SECONDS ), "detectionSpace": { - "orbit": "camera_relative_trajectory", - "otherEligibleFamilies": "final_world_position", + "orbit": ( + "camera_relative_trajectory_then_" + "final_camera_relative_position_post_radial_audit" + ), + "otherEligibleFamilies": ( + "final_world_position_then_" + "final_world_position_post_radial_audit" + ), }, "relativeTemplatePrepassApplied": True, "relativeTemplatePrepassScope": "orbit_only", - "nonOrbitFinalWorldPassOnly": True, - "perShotKinematicPassCount": 1, + "postRadialAuditAppliedToAllMotionFamilies": True, + "perShotKinematicPassCount": 2, + "postRadialRepairSafetyPolicy": ( + "accept_once_if_distance_annulus_and_step_remain_safe_" + "otherwise_restore_bounded_path_and_reject_unresolved_turn" + ), + "finalPostClampKinematicAuditFailClosed": True, "turnWindowContinuity": "C2_quintic_outer_seams", "initialInputEventsOnly": True, "maximumAccelerationRegressionRatio": ( @@ -11507,10 +12748,21 @@ def main() -> None: bool(shot["hardPersonSafetyPassed"]) for shot in shots ), "frontFacingSafetyPolicy": { + "version": FRONT_FACING_POLICY_VERSION, "directionSource": ( "canonical torso normal from right-minus-left shoulder " "cross head-minus-pelvis" ), + "stableReferenceSource": ( + "character-root local horizontal direction calibrated once " + "from the full target-song anatomical torso normal" + ), + "stableReferenceCalibration": front_facing_reference, + "faceOrientationAvailability": ( + "unavailable: generation input contains joint positions and " + "root/hips rotation, but no face landmarks or head rotation" + ), + "choreographyTurnRequiresStrictPersonAndSemanticVisibility": True, "cameraBodyFollowsDirection": False, "alignmentMedianMinimum": ( FRONT_FACING_ALIGNMENT_MEDIAN_MINIMUM @@ -11522,6 +12774,18 @@ def main() -> None: "maximumSevereRearRunSeconds": ( FRONT_FACING_MAXIMUM_SEVERE_REAR_RUN_SECONDS ), + "stableReferenceMinimumReliability": ( + FRONT_FACING_STABLE_REFERENCE_MINIMUM_RELIABILITY + ), + "stableReferenceMinimumValidFrameRatio": ( + FRONT_FACING_STABLE_REFERENCE_MINIMUM_VALID_FRAME_RATIO + ), + "stableAlignmentMedianMinimum": ( + FRONT_FACING_STABLE_ALIGNMENT_MEDIAN_MINIMUM + ), + "instantaneousAnatomyRoleWhenStableReferenceAvailable": ( + "soft preference and choreography-turn audit only" + ), "failClosed": True, }, "frontFacingSafetyPassed": all( @@ -11545,6 +12809,15 @@ def main() -> None: for shot in shots ) ), + "frontFacingChoreographyTurnExceptionCount": sum( + bool( + shot.get( + "frontFacingChoreographyTurnExceptionApplied", + False, + ) + ) + for shot in shots + ), "semanticAimQualityPassed": all( bool(shot["aimQualityPassed"]) for shot in shots ), @@ -11688,6 +12961,18 @@ def main() -> None: ) for shot in shots ), + "finalPostClampKinematicSafetyPassed": all( + shot.get("finalPostClampKinematicPassed") is True + for shot in shots + ), + "finalPostClampKinematicPassedShotCount": sum( + shot.get("finalPostClampKinematicPassed") is True + for shot in shots + ), + "finalPostClampKinematicFailedShotCount": sum( + shot.get("finalPostClampKinematicPassed") is not True + for shot in shots + ), "translationDirectionReversalCountBeforeAfter": [ sum( int(shot.get("translationDirectionReversalCountBefore", 0)) diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py index 62d4491..3a9f5cd 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/trajectory_quality.py @@ -17,7 +17,18 @@ import numpy as np TRAJECTORY_QUALITY_VERSION = "trajectory-quality-v2" C2_RESAMPLING_POLICY_VERSION = "clamped-cubic-c2-endpoint-speed-guard-v1" RADIAL_CLAMP_POLICY_VERSION = "quintic-bound-identity-c2-speed-adaptive-v2" -DYNAMICS_POLICY_VERSION = "translation-screen-space-cost-hard-gate-v2" +DYNAMICS_POLICY_VERSION = ( + "camera-motion-stabilized-screen-residual-cost-hard-gate-v3" +) + +RAW_SUBJECT_SCREEN_INPUT = "raw_subject_uv" +STABILIZED_SCREEN_RESIDUAL_INPUT = "stabilized_residual_uv" +SCREEN_INPUT_KINDS = frozenset( + { + RAW_SUBJECT_SCREEN_INPUT, + STABILIZED_SCREEN_RESIDUAL_INPUT, + } +) @dataclass(frozen=True) @@ -43,7 +54,14 @@ class ResamplingGuardPolicy: @dataclass(frozen=True) class CandidateDynamicsPolicy: - """Transparent scales and weights for a candidate dynamics cost.""" + """Transparent scales, free thresholds, and weights for soft ranking. + + The free thresholds represent authored-safe motion that should not change + candidate ordering. Only dynamics above a threshold contribute to the + soft cost. Raw subject screen positions are diagnostic-only because they + contain performer motion; screen acceleration and jerk are scored only + when the caller explicitly supplies a stabilized semantic-target residual. + """ translation_speed_p99_scale: float = 4.0 translation_acceleration_p99_scale: float = 12.0 @@ -53,14 +71,25 @@ class CandidateDynamicsPolicy: screen_acceleration_p99_scale: float = 12.0 screen_jerk_p99_scale: float = 300.0 screen_horizontal_reversal_count_scale: float = 3.0 + translation_speed_p99_free_threshold: float = 2.0 + translation_acceleration_p99_free_threshold: float = 6.0 + translation_jerk_p99_free_threshold: float = 120.0 + lateral_reversal_count_free_threshold: float = 1.0 + screen_speed_p99_free_threshold: float = 0.0 + screen_acceleration_p99_free_threshold: float = 6.0 + screen_jerk_p99_free_threshold: float = 180.0 + screen_horizontal_reversal_count_free_threshold: float = 0.0 translation_speed_weight: float = 0.10 translation_acceleration_weight: float = 0.75 translation_jerk_weight: float = 1.00 lateral_reversal_weight: float = 0.60 - screen_speed_weight: float = 0.15 + # Raw subject speed and reversal count mostly describe choreography, not a + # camera-body jolt. Keep both metrics in the audit payload but exclude + # them from the default soft score even for a residual input. + screen_speed_weight: float = 0.0 screen_acceleration_weight: float = 0.90 screen_jerk_weight: float = 1.20 - screen_horizontal_reversal_weight: float = 0.80 + screen_horizontal_reversal_weight: float = 0.0 maximum_component_ratio: float = 8.0 maximum_acceptable_cost: float = 6.0 @@ -73,6 +102,8 @@ class CandidateDynamicsPolicy: raise ValueError(f"{name} must be positive") if name.endswith("_weight") and value < 0.0: raise ValueError(f"{name} must be non-negative") + if name.endswith("_free_threshold") and value < 0.0: + raise ValueError(f"{name} must be non-negative") if self.maximum_component_ratio <= 0.0: raise ValueError("maximum_component_ratio must be positive") if self.maximum_acceptable_cost < 0.0: @@ -910,16 +941,27 @@ def candidate_dynamics_cost( screen_space_metrics: Mapping[str, object] | None = None, *, policy: CandidateDynamicsPolicy | None = None, + screen_input_kind: str = RAW_SUBJECT_SCREEN_INPUT, ) -> tuple[float, dict[str, object]]: """Return a transparent dynamics cost for a generated camera candidate. - High-frequency acceleration, jerk, and persistent lateral reversals receive - more weight than steady speed. This allows deliberate low-frequency camera - travel while making left/right chatter expensive. + High-frequency camera acceleration and jerk receive more weight than + authored-safe low-frequency travel. ``screen_space_metrics`` is scored + only when ``screen_input_kind`` is ``stabilized_residual_uv``. That input + must be the projected semantic focus minus its stabilized desired UV path, + not the raw projected performer position. Raw subject UV remains in the + returned audit but contributes no soft cost, so choreography is not + mistaken for camera shake. This function does not change any downstream + hard safety gate or the metrics those gates consume. """ selected_policy = policy or CandidateDynamicsPolicy() selected_policy.validate() + if screen_input_kind not in SCREEN_INPUT_KINDS: + raise ValueError( + "screen_input_kind must be raw_subject_uv or " + "stabilized_residual_uv" + ) raw_components = [ ( "translationSpeedP99", @@ -930,6 +972,8 @@ def candidate_dynamics_cost( ), selected_policy.translation_speed_p99_scale, selected_policy.translation_speed_weight, + selected_policy.translation_speed_p99_free_threshold, + False, ), ( "translationAccelerationP99", @@ -940,6 +984,8 @@ def candidate_dynamics_cost( ), selected_policy.translation_acceleration_p99_scale, selected_policy.translation_acceleration_weight, + selected_policy.translation_acceleration_p99_free_threshold, + False, ), ( "translationJerkP99", @@ -950,12 +996,16 @@ def candidate_dynamics_cost( ), selected_policy.translation_jerk_p99_scale, selected_policy.translation_jerk_weight, + selected_policy.translation_jerk_p99_free_threshold, + False, ), ( "persistentLateralReversalCount", float(translation_metrics.get("persistentLateralReversalCount", 0)), selected_policy.lateral_reversal_count_scale, selected_policy.lateral_reversal_weight, + selected_policy.lateral_reversal_count_free_threshold, + False, ), ] if screen_space_metrics is not None: @@ -970,6 +1020,8 @@ def candidate_dynamics_cost( ), selected_policy.screen_speed_p99_scale, selected_policy.screen_speed_weight, + selected_policy.screen_speed_p99_free_threshold, + True, ), ( "screenAccelerationP99", @@ -980,6 +1032,8 @@ def candidate_dynamics_cost( ), selected_policy.screen_acceleration_p99_scale, selected_policy.screen_acceleration_weight, + selected_policy.screen_acceleration_p99_free_threshold, + True, ), ( "screenJerkP99", @@ -990,6 +1044,8 @@ def candidate_dynamics_cost( ), selected_policy.screen_jerk_p99_scale, selected_policy.screen_jerk_weight, + selected_policy.screen_jerk_p99_free_threshold, + True, ), ( "persistentHorizontalReversalCount", @@ -1001,23 +1057,46 @@ def candidate_dynamics_cost( ), selected_policy.screen_horizontal_reversal_count_scale, selected_policy.screen_horizontal_reversal_weight, + ( + selected_policy + .screen_horizontal_reversal_count_free_threshold + ), + True, ), ] ) - components: dict[str, dict[str, float]] = {} + components: dict[str, dict[str, float | bool]] = {} total_cost = 0.0 - for name, value, scale, weight in raw_components: + score_screen_residual = ( + screen_input_kind == STABILIZED_SCREEN_RESIDUAL_INPUT + ) + for name, value, scale, configured_weight, free_threshold, is_screen in ( + raw_components + ): if not np.isfinite(value) or value < 0.0: raise ValueError(f"candidate dynamics component {name} is invalid") - normalized = min(value / scale, selected_policy.maximum_component_ratio) + weight = ( + configured_weight + if not is_screen or score_screen_residual + else 0.0 + ) + excess = max(0.0, value - free_threshold) + normalized = min( + excess / scale, + selected_policy.maximum_component_ratio, + ) contribution = weight * normalized**2 components[name] = { "value": float(value), "scale": float(scale), "weight": float(weight), + "configuredWeight": float(configured_weight), + "freeThreshold": float(free_threshold), + "excessAboveFreeThreshold": float(excess), "normalized": float(normalized), "cost": float(contribution), + "screenInputSuppressed": bool(is_screen and not score_screen_residual), } total_cost += contribution @@ -1031,6 +1110,17 @@ def candidate_dynamics_cost( ), "components": components, "screenSpaceIncluded": screen_space_metrics is not None, + "screenSpaceInputKind": ( + screen_input_kind if screen_space_metrics is not None else None + ), + "screenSpaceSoftCostEnabled": bool( + screen_space_metrics is not None and score_screen_residual + ), + "screenSpaceInputContract": ( + "Score only stabilized semantic-focus residual UV: " + "projected_focus_uv - stabilized_desired_uv. Raw subject UV is " + "diagnostic-only and is excluded from soft candidate ranking." + ), "policy": asdict(selected_policy), } return float(total_cost), details @@ -1042,8 +1132,15 @@ def evaluate_candidate_dynamics( *, sample_rate: float = 60.0, policy: CandidateDynamicsPolicy | None = None, + screen_input_kind: str = RAW_SUBJECT_SCREEN_INPUT, ) -> dict[str, object]: - """Measure and score a candidate in one call.""" + """Measure and score a candidate in one call. + + ``screen_positions_uv`` defaults to ``raw_subject_uv`` and is then kept + only for diagnostics and downstream hard-gate auditing. A caller that + wants screen-space soft scoring must pass a stabilized semantic-focus + residual and set ``screen_input_kind="stabilized_residual_uv"``. + """ translation = translation_dynamics_metrics( positions_meters, @@ -1063,6 +1160,7 @@ def evaluate_candidate_dynamics( translation, screen, policy=policy, + screen_input_kind=screen_input_kind, ) return { **cost_details, @@ -1075,6 +1173,8 @@ __all__ = [ "C2_RESAMPLING_POLICY_VERSION", "DYNAMICS_POLICY_VERSION", "RADIAL_CLAMP_POLICY_VERSION", + "RAW_SUBJECT_SCREEN_INPUT", + "STABILIZED_SCREEN_RESIDUAL_INPUT", "TRAJECTORY_QUALITY_VERSION", "CandidateDynamicsPolicy", "ResamplingGuardPolicy", diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite.libs/msvcp140-8f141b4454fa78db34bc1f28c571b4da.dll b/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite.libs/msvcp140-8f141b4454fa78db34bc1f28c571b4da.dll deleted file mode 100644 index 2c5f878..0000000 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite.libs/msvcp140-8f141b4454fa78db34bc1f28c571b4da.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f141b4454fa78db34bc1f28c571b4da0e00cd2c43f7ad0e282f313036826aae -size 557648 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite/binding/llvmlite.dll b/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite/binding/llvmlite.dll index 7071d6d..f780819 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite/binding/llvmlite.dll +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/llvmlite/binding/llvmlite.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b96da0a5480e1f0c294b8f975cf34e82392beee260974961ccce98ff4f61bf98 -size 120369152 +oid sha256:70042dc5e4b5536971f24f00871e679332fd47f20cebbd55d7aa8e64a5f5aa1c +size 80374272 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/msgpack/_cmsgpack.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/msgpack/_cmsgpack.cp312-win_amd64.pyd index 1ba0072..7b0f13e 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/msgpack/_cmsgpack.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/msgpack/_cmsgpack.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f420c86362c601e6a3c1542b92b2bef766c3d7389e45dd8c7b51947462f4372a -size 125440 +oid sha256:c8704d71e0b61fb1ce39e35fcd93c1e7dcb8bd073c1127b962a97234582aa90c +size 133120 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_devicearray.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_devicearray.cp312-win_amd64.pyd index 77c15e7..1183e59 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_devicearray.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_devicearray.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a1c959979189ca8dc7177f45b0515c9875a1e723ee61a0e603e9c9171fcde5a1 -size 12288 +oid sha256:d05e81abee10ecdbda531bfb4c0853d9784b9f48ba4f8fafecbfa8aed919cab9 +size 11264 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dispatcher.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dispatcher.cp312-win_amd64.pyd index 269e306..e1de36a 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dispatcher.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dispatcher.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:003b6dd9ad863a74a8e10b791233d74c04f6ff0e9fbb29c38acdf6a201c1afe7 -size 41472 +oid sha256:99c2d9bf30e1dd11f78a594b4f3fc9a0619b668637848e9a877115db03623ec1 +size 40960 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dynfunc.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dynfunc.cp312-win_amd64.pyd index 703a953..9be464f 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dynfunc.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_dynfunc.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f9f15395383966d2e9ae2e4e7d55bd2699feec30ce26cc62dcadf768869c6b7 -size 16896 +oid sha256:55e7b0aeb8883c6e1d8baef3a0e13e369a944c468824a0c0c8d11384c840175e +size 16384 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_helperlib.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_helperlib.cp312-win_amd64.pyd index 8c62cf7..bcf0797 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_helperlib.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/_helperlib.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12550aaa35537544cbd09e941d182df967d2b368c9c21fa2bc1ac3a041057dd8 -size 203776 +oid sha256:df596f9148274728704523de8dc1ffa695910dc0fda3865fb0483607920e5d2a +size 195584 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/runtime/_nrt_python.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/runtime/_nrt_python.cp312-win_amd64.pyd index ae7986d..c614dbf 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/runtime/_nrt_python.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/runtime/_nrt_python.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4deba0d29d42f4188479842acada06cd04f5622c0924ee1403734ec02da884b1 +oid sha256:a10689046d8e04b5b5c04fcd3012689998f22ea4bbd0a326e6ff4146f6c9669c size 25088 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/typeconv/_typeconv.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/typeconv/_typeconv.cp312-win_amd64.pyd index 24fb2e7..d71cee2 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/typeconv/_typeconv.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/core/typeconv/_typeconv.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9fd75ce5f18f4a1de01cf2d08b67678c262f98135dd141780bfe5a5eddb04ff4 -size 20480 +oid sha256:a40884e534b457561e3ddd3aa399bdfdf22d10043ffeef6b71e5b2883e1ca2b7 +size 19968 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/cuda/cudadrv/_extras.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/cuda/cudadrv/_extras.cp312-win_amd64.pyd index 703eab6..665dccb 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/cuda/cudadrv/_extras.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/cuda/cudadrv/_extras.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c48670009cc8d8758bb598d1902dfcb49eed29766324bdd8176a3af25c6d6fc3 +oid sha256:287b8626b5a347f4d23d30d4dd8fdfc2f579dedff1cf14d11b3078d76a85b785 size 10752 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/experimental/jitclass/_box.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/experimental/jitclass/_box.cp312-win_amd64.pyd index ba50320..95bb0fb 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/experimental/jitclass/_box.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/experimental/jitclass/_box.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8b74952127647ddbecdeb2ba1a89395f1b5efbbd0d6940fbda104f1cfa53768 +oid sha256:0e3c7e9846374a3c54792c74984b41d81746b8fba77cc90da42597bf1b1cdc11 size 12800 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/mviewbuf.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/mviewbuf.cp312-win_amd64.pyd index e61beec..e847d37 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/mviewbuf.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/mviewbuf.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff9eb34b6215358f3dec572c5a8b264d584ee40a0b8356697d6c08bbabcea953 +oid sha256:03c47d3f6ebcfa2213f7172abc34603ee93be6655316855508c30b03e5b18e95 size 14848 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/_internal.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/_internal.cp312-win_amd64.pyd index f169c12..81b5872 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/_internal.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/_internal.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27c3a8699c997b271d0b5d6ec07df24916e5e96f40340a219ab4d4ced8b1a8ad +oid sha256:1113a1f0aa33cb154dd5323dd7a7b755ce9bec422f7d14ef80ad66c88a2739fe size 23552 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/omppool.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/omppool.cp312-win_amd64.pyd index 256aae6..13a1b16 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/omppool.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/omppool.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29236ad669465e578bbab615aa230c141afed42117943d479266cb55b223dbb4 -size 35840 +oid sha256:ca7e736584e0451ead16b70392e68fe2c004c7dcc9228fedd561f09a5a6735ec +size 34304 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/tbbpool.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/tbbpool.cp312-win_amd64.pyd index 496102b..f7f7c75 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/tbbpool.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/tbbpool.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27ea4914045aa91be19e0cb973f6e0434596349febcebfa77c4c03c14360562b -size 46592 +oid sha256:18d17b2a38ca26b6135ecad3425c0adc616131c67cdcf62ca7e8fb0be7aec445 +size 45056 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/workqueue.cp312-win_amd64.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/workqueue.cp312-win_amd64.pyd index e9c04e2..6d7f5fd 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/workqueue.cp312-win_amd64.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/numba/np/ufunc/workqueue.cp312-win_amd64.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6b6d0fef0532cec9b332475ef1a37e3e2f6a4bcdcec0dba55feadc36a02e595 -size 38400 +oid sha256:086d916df64bc481cfa7b1a8f7851bf76abccbf1e9dc4df9d4b5d50ade3caf4c +size 36864 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA new file mode 100644 index 0000000..85513e8 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA @@ -0,0 +1,129 @@ +Metadata-Version: 2.1 +Name: importlib_metadata +Version: 8.0.0 +Summary: Read metadata from Python packages +Author-email: "Jason R. Coombs" +Project-URL: Source, https://github.com/python/importlib_metadata +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: zipp >=0.5 +Requires-Dist: typing-extensions >=3.6.4 ; python_version < "3.8" +Provides-Extra: doc +Requires-Dist: sphinx >=3.5 ; extra == 'doc' +Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc' +Requires-Dist: rst.linker >=1.9 ; extra == 'doc' +Requires-Dist: furo ; extra == 'doc' +Requires-Dist: sphinx-lint ; extra == 'doc' +Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc' +Provides-Extra: perf +Requires-Dist: ipython ; extra == 'perf' +Provides-Extra: test +Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test' +Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' +Requires-Dist: pytest-mypy ; extra == 'test' +Requires-Dist: pytest-enabler >=2.2 ; extra == 'test' +Requires-Dist: pytest-ruff >=0.2.1 ; extra == 'test' +Requires-Dist: packaging ; extra == 'test' +Requires-Dist: pyfakefs ; extra == 'test' +Requires-Dist: flufl.flake8 ; extra == 'test' +Requires-Dist: pytest-perf >=0.9.2 ; extra == 'test' +Requires-Dist: jaraco.test >=5.4 ; extra == 'test' +Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == 'test' + +.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg + :target: https://pypi.org/project/importlib_metadata + +.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg + +.. image:: https://github.com/python/importlib_metadata/actions/workflows/main.yml/badge.svg + :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22 + :alt: tests + +.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff + :alt: Ruff + +.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest + :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest + +.. image:: https://img.shields.io/badge/skeleton-2024-informational + :target: https://blog.jaraco.com/skeleton + +.. image:: https://tidelift.com/badges/package/pypi/importlib-metadata + :target: https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=readme + +Library to access the metadata for a Python package. + +This package supplies third-party access to the functionality of +`importlib.metadata `_ +including improvements added to subsequent Python versions. + + +Compatibility +============= + +New features are introduced in this third-party library and later merged +into CPython. The following table indicates which versions of this library +were contributed to different versions in the standard library: + +.. list-table:: + :header-rows: 1 + + * - importlib_metadata + - stdlib + * - 7.0 + - 3.13 + * - 6.5 + - 3.12 + * - 4.13 + - 3.11 + * - 4.6 + - 3.10 + * - 1.4 + - 3.8 + + +Usage +===== + +See the `online documentation `_ +for usage details. + +`Finder authors +`_ can +also add support for custom package installers. See the above documentation +for details. + + +Caveats +======= + +This project primarily supports third-party packages installed by PyPA +tools (or other conforming packages). It does not support: + +- Packages in the stdlib. +- Packages installed without metadata. + +Project details +=============== + + * Project home: https://github.com/python/importlib_metadata + * Report bugs at: https://github.com/python/importlib_metadata/issues + * Code hosting: https://github.com/python/importlib_metadata + * Documentation: https://importlib-metadata.readthedocs.io/ + +For Enterprise +============== + +Available as part of the Tidelift Subscription. + +This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. + +`Learn more `_. diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD new file mode 100644 index 0000000..17296a8 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD @@ -0,0 +1,32 @@ +importlib_metadata-8.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_metadata-8.0.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_metadata-8.0.0.dist-info/METADATA,sha256=anuQ7_7h4J1bSEzfcjIBakPi2cyVQ7y7jklLHsBeH1k,4648 +importlib_metadata-8.0.0.dist-info/RECORD,, +importlib_metadata-8.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata-8.0.0.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91 +importlib_metadata-8.0.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 +importlib_metadata/__init__.py,sha256=tZNB-23h8Bixi9uCrQqj9Yf0aeC--Josdy3IZRIQeB0,33798 +importlib_metadata/__pycache__/__init__.cpython-312.pyc,, +importlib_metadata/__pycache__/_adapters.cpython-312.pyc,, +importlib_metadata/__pycache__/_collections.cpython-312.pyc,, +importlib_metadata/__pycache__/_compat.cpython-312.pyc,, +importlib_metadata/__pycache__/_functools.cpython-312.pyc,, +importlib_metadata/__pycache__/_itertools.cpython-312.pyc,, +importlib_metadata/__pycache__/_meta.cpython-312.pyc,, +importlib_metadata/__pycache__/_text.cpython-312.pyc,, +importlib_metadata/__pycache__/diagnose.cpython-312.pyc,, +importlib_metadata/_adapters.py,sha256=rIhWTwBvYA1bV7i-5FfVX38qEXDTXFeS5cb5xJtP3ks,2317 +importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 +importlib_metadata/_compat.py,sha256=73QKrN9KNoaZzhbX5yPCCZa-FaALwXe8TPlDR72JgBU,1314 +importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 +importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 +importlib_metadata/_meta.py,sha256=nxZ7C8GVlcBFAKWyVOn_dn7ot_twBcbm1NmvjIetBHI,1801 +importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 +importlib_metadata/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata/compat/__pycache__/__init__.cpython-312.pyc,, +importlib_metadata/compat/__pycache__/py311.cpython-312.pyc,, +importlib_metadata/compat/__pycache__/py39.cpython-312.pyc,, +importlib_metadata/compat/py311.py,sha256=uqm-K-uohyj1042TH4a9Er_I5o7667DvulcD-gC_fSA,608 +importlib_metadata/compat/py39.py,sha256=cPkMv6-0ilK-0Jw_Tkn0xYbOKJZc4WJKQHow0c2T44w,1102 +importlib_metadata/diagnose.py,sha256=nkSRMiowlmkhLYhKhvCg9glmt_11Cox-EmLzEbqYTa8,379 +importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL new file mode 100644 index 0000000..edf4ec7 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (70.1.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt new file mode 100644 index 0000000..bbb0754 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +importlib_metadata diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/soxr/soxr_ext.pyd b/CameraAI~/Tools~/CWCameraWorker/_internal/soxr/soxr_ext.pyd index 266b64e..c5f20fd 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/soxr/soxr_ext.pyd +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/soxr/soxr_ext.pyd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:17850a2a3af1c7f317a13ab5065711e9e40ac3a92ca17fefb6e4bda58b7ad908 -size 354304 +oid sha256:8095eee392482bf1996f1305fb609b6b5877494da3bd90e8dda685806a262545 +size 350720 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/INSTALLER b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/LICENSE.txt b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..a31470f --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012 Daniel Holth and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/METADATA b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/METADATA new file mode 100644 index 0000000..f645dcb --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/METADATA @@ -0,0 +1,66 @@ +Metadata-Version: 2.3 +Name: wheel +Version: 0.45.1 +Summary: A built-package format for Python +Keywords: wheel,packaging +Author-email: Daniel Holth +Maintainer-email: Alex Grönholm +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Requires-Dist: pytest >= 6.0.0 ; extra == "test" +Requires-Dist: setuptools >= 65 ; extra == "test" +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Project-URL: Source, https://github.com/pypa/wheel +Provides-Extra: test + +wheel +===== + +This is a command line tool for manipulating Python wheel files, as defined in +`PEP 427`_. It contains the following functionality: + +* Convert ``.egg`` archives into ``.whl`` +* Unpack wheel archives +* Repack wheel archives +* Add or remove tags in existing wheel archives + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ + +Historical note +--------------- + +This project used to contain the implementation of the setuptools_ ``bdist_wheel`` +command, but as of setuptools v70.1, it no longer needs ``wheel`` installed for that to +work. Thus, you should install this **only** if you intend to use the ``wheel`` command +line tool! + +.. _setuptools: https://pypi.org/project/setuptools/ + +Documentation +------------- + +The documentation_ can be found on Read The Docs. + +.. _documentation: https://wheel.readthedocs.io/ + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. + +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md + diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD new file mode 100644 index 0000000..b0c81fd --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/RECORD @@ -0,0 +1,68 @@ +../../Scripts/wheel.exe,sha256=A69vg7y22iGuDMaqOWKEJzU_3jcjugdke2okLg6B5Cg,108448 +wheel-0.45.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel-0.45.1.dist-info/LICENSE.txt,sha256=MMI2GGeRCPPo6h0qZYx8pBe9_IkcmO8aifpP8MmChlQ,1107 +wheel-0.45.1.dist-info/METADATA,sha256=mKz84H7m7jsxJyzeIcTVORiTb0NPMV39KvOIYhGgmjA,2313 +wheel-0.45.1.dist-info/RECORD,, +wheel-0.45.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wheel-0.45.1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +wheel-0.45.1.dist-info/entry_points.txt,sha256=rTY1BbkPHhkGMm4Q3F0pIzJBzW2kMxoG1oriffvGdA0,104 +wheel/__init__.py,sha256=mrxMnvdXACur_LWegbUfh5g5ysWZrd63UJn890wvGNk,59 +wheel/__main__.py,sha256=NkMUnuTCGcOkgY0IBLgBCVC_BGGcWORx2K8jYGS12UE,455 +wheel/__pycache__/__init__.cpython-312.pyc,, +wheel/__pycache__/__main__.cpython-312.pyc,, +wheel/__pycache__/_bdist_wheel.cpython-312.pyc,, +wheel/__pycache__/_setuptools_logging.cpython-312.pyc,, +wheel/__pycache__/bdist_wheel.cpython-312.pyc,, +wheel/__pycache__/macosx_libfile.cpython-312.pyc,, +wheel/__pycache__/metadata.cpython-312.pyc,, +wheel/__pycache__/util.cpython-312.pyc,, +wheel/__pycache__/wheelfile.cpython-312.pyc,, +wheel/_bdist_wheel.py,sha256=UghCQjSH_pVfcZh6oRjzSw_TQhcf3anSx1OkiLSL82M,21694 +wheel/_setuptools_logging.py,sha256=-5KC-lne0ilOUWIDfOkqapUWGMFZhuKYDIavIZiB5kM,781 +wheel/bdist_wheel.py,sha256=tpf9WufiSO1RuEMg5oPhIfSG8DMziCZ_4muCKF69Cqo,1107 +wheel/cli/__init__.py,sha256=Npq6_jKi03dhIcRnmbuFhwviVJxwO0tYEnEhWMv9cJo,4402 +wheel/cli/__pycache__/__init__.cpython-312.pyc,, +wheel/cli/__pycache__/convert.cpython-312.pyc,, +wheel/cli/__pycache__/pack.cpython-312.pyc,, +wheel/cli/__pycache__/tags.cpython-312.pyc,, +wheel/cli/__pycache__/unpack.cpython-312.pyc,, +wheel/cli/convert.py,sha256=Bi0ntEXb9nTllCxWeTRQ4j-nPs3szWSEKipG_GgnMkQ,12634 +wheel/cli/pack.py,sha256=CAFcHdBVulvsHYJlndKVO7KMI9JqBTZz5ii0PKxxCOs,3103 +wheel/cli/tags.py,sha256=lHw-LaWrkS5Jy_qWcw-6pSjeNM6yAjDnqKI3E5JTTCU,4760 +wheel/cli/unpack.py,sha256=Y_J7ynxPSoFFTT7H0fMgbBlVErwyDGcObgme5MBuz58,1021 +wheel/macosx_libfile.py,sha256=k1x7CE3LPtOVGqj6NXQ1nTGYVPaeRrhVzUG_KPq3zDs,16572 +wheel/metadata.py,sha256=JC4p7jlQZu2bUTAQ2fevkqLjg_X6gnNyRhLn6OUO1tc,6171 +wheel/util.py,sha256=aL7aibHwYUgfc8WlolL5tXdkV4DatbJxZHb1kwHFJAU,423 +wheel/vendored/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wheel/vendored/__pycache__/__init__.cpython-312.pyc,, +wheel/vendored/packaging/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197 +wheel/vendored/packaging/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174 +wheel/vendored/packaging/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344 +wheel/vendored/packaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wheel/vendored/packaging/__pycache__/__init__.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/_elffile.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/_manylinux.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/_musllinux.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/_parser.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/_structures.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/_tokenizer.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/markers.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/requirements.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/specifiers.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/tags.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/utils.cpython-312.pyc,, +wheel/vendored/packaging/__pycache__/version.cpython-312.pyc,, +wheel/vendored/packaging/_elffile.py,sha256=hbmK8OD6Z7fY6hwinHEUcD1by7czkGiNYu7ShnFEk2k,3266 +wheel/vendored/packaging/_manylinux.py,sha256=P7sdR5_7XBY09LVYYPhHmydMJIIwPXWsh4olk74Uuj4,9588 +wheel/vendored/packaging/_musllinux.py,sha256=z1s8To2hQ0vpn_d-O2i5qxGwEK8WmGlLt3d_26V7NeY,2674 +wheel/vendored/packaging/_parser.py,sha256=4tT4emSl2qTaU7VTQE1Xa9o1jMPCsBezsYBxyNMUN-s,10347 +wheel/vendored/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +wheel/vendored/packaging/_tokenizer.py,sha256=alCtbwXhOFAmFGZ6BQ-wCTSFoRAJ2z-ysIf7__MTJ_k,5292 +wheel/vendored/packaging/markers.py,sha256=_TSPI1BhJYO7Bp9AzTmHQxIqHEVXaTjmDh9G-w8qzPA,8232 +wheel/vendored/packaging/requirements.py,sha256=dgoBeVprPu2YE6Q8nGfwOPTjATHbRa_ZGLyXhFEln6Q,2933 +wheel/vendored/packaging/specifiers.py,sha256=IWSt0SrLSP72heWhAC8UL0eGvas7XIQHjqiViVfmPKE,39778 +wheel/vendored/packaging/tags.py,sha256=fedHXiOHkBxNZTXotXv8uXPmMFU9ae-TKBujgYHigcA,18950 +wheel/vendored/packaging/utils.py,sha256=XgdmP3yx9-wQEFjO7OvMj9RjEf5JlR5HFFR69v7SQ9E,5268 +wheel/vendored/packaging/version.py,sha256=PFJaYZDxBgyxkfYhH3SQw4qfE9ICCWrTmitvq14y3bs,16234 +wheel/vendored/vendor.txt,sha256=Z2ENjB1i5prfez8CdM1Sdr3c6Zxv2rRRolMpLmBncAE,16 +wheel/wheelfile.py,sha256=USCttNlJwafxt51YYFFKG7jnxz8dfhbyqAZL6jMTA9s,8411 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/REQUESTED b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/WHEEL b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/WHEEL new file mode 100644 index 0000000..e3c6fee --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/entry_points.txt b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/entry_points.txt new file mode 100644 index 0000000..06c9f69 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/wheel-0.45.1.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel=wheel.cli:main + +[distutils.commands] +bdist_wheel=wheel.bdist_wheel:bdist_wheel + diff --git a/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json b/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json new file mode 100644 index 0000000..9b6b092 --- /dev/null +++ b/CameraAI~/Tools~/CWCameraWorker/cw_camera_worker_distribution_manifest.json @@ -0,0 +1,78 @@ +{ + "schemaVersion": "cw-camera-worker-distribution-build-v1", + "createdUtc": "2026-08-08T20:03:52.1316389Z", + "workerVersion": "0.1.5", + "protocolVersion": "1", + "buildIdentitySchemaVersion": "cw-camera-worker-build-identity-v1", + "buildEnvironment": { + "kind": "disposable_venv", + "pythonVersion": "3.12.13", + "isolatedPrefixVerified": true, + "userSiteEnabled": false, + "threadLimits": { + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1", + "NUMEXPR_NUM_THREADS": "1", + "VECLIB_MAXIMUM_THREADS": "1", + "BLIS_NUM_THREADS": "1" + }, + "installedDistributions": [ + "altgraph==0.17.5", + "audioread==3.1.0", + "certifi==2024.12.14", + "cffi==2.0.0", + "charset-normalizer==3.4.1", + "decorator==5.1.1", + "idna==3.10", + "joblib==1.5.2", + "lazy_loader==0.4", + "librosa==0.11.0", + "llvmlite==0.43.0", + "msgpack==1.1.2", + "numba==0.60.0", + "numpy==1.26.4", + "packaging==26.2", + "pefile==2024.8.26", + "pip==25.0.1", + "platformdirs==4.9.6", + "pooch==1.8.2", + "pycparser==2.21", + "pyinstaller==6.17.0", + "pyinstaller-hooks-contrib==2025.10", + "pywin32-ctypes==0.2.3", + "requests==2.32.3", + "scikit-learn==1.7.2", + "scipy==1.15.3", + "setuptools==78.1.0", + "soundfile==0.13.1", + "soxr==1.0.0", + "threadpoolctl==3.6.0", + "typing_extensions==4.15.0", + "urllib3==2.3.0", + "wheel==0.45.1" + ] + }, + "requirements": [ + { + "path": "MachineLearning/CameraDirector/requirements-worker.txt", + "sha256": "90987782184e15119a6090922e464559e620b6b164b80b5ae4f567e8ae6a7b9d" + }, + { + "path": "MachineLearning/CameraDirector/requirements-worker-build.txt", + "sha256": "1ae29e0b81e82bdcbcb14d1817813e5f60e45ae260af0e693a66cc24f3ae6827" + } + ], + "payload": { + "fileCount": 646, + "bytes": 267603627, + "executableSha256": "055fb16b60454b0d131ed2201eccad8d11977bd99ef011468d44638b33e4a1ef", + "buildIdentitySha256": "84428e90a523ec40aa54d45c7b795e586979fce6f4a0e139e0bd83fc3c0ce906", + "sanityRange": { + "minimumFileCount": 500, + "maximumFileCount": 1000, + "minimumBytes": 209715200, + "maximumBytes": 393216000 + } + } +} diff --git a/CameraAI~/package.json b/CameraAI~/package.json index 403331a..c7c4dde 100644 --- a/CameraAI~/package.json +++ b/CameraAI~/package.json @@ -1,6 +1,6 @@ { "name": "com.mingle.cw-ai", - "version": "0.4.8", + "version": "0.4.9", "displayName": "Mingle Camera Work AI", "description": "Self-contained high-quality Unity Timeline camera generation with an embedded prepared reference library, per-shot editable clips, and A/B review tools.", "unity": "6000.0", diff --git a/README.md b/README.md index 21d6241..f787de7 100644 --- a/README.md +++ b/README.md @@ -37,16 +37,16 @@ Install **Git and Git LFS before opening Unity**, then use **Add package from git URL** with: ```text -https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.6 +https://kindnick-git.duckdns.org/mingle/streamingle-unity-utilities.git?path=/CameraAI~#v0.1.15 ``` The Camera AI package includes the complete Windows x64 -`CWCameraWorker.exe` onedir build, so artist workstations do not need Python. -The executable must remain beside its `_internal` directory. Authored camera, -character-motion, and source-audio reference data are not mirrored in this -utility repository; connect an access-controlled `CW-AI` data root containing -`DatasetExports`, `reports/training_index.json`, and -`models/cut_ranker_v2.json`. +`CWCameraWorker.exe` onedir build and a read-only prepared reference library, +so artist workstations do not need Python or a separate `CW-AI` checkout. +The executable must remain beside its `_internal` directory. A newer +access-controlled `CW-AI` data root containing `DatasetExports`, +`reports/training_index.json`, and `models/cut_ranker_v2.json` remains an +optional override. After installation, open `Tools > Streamingle > AI 카메라 생성`. The package automatically locates its bundled worker and validates the configured data