Commit f674380a authored by Snawoot's avatar Snawoot Committed by GitHub

Merge pull request #196 from Snawoot/oysteinkrog

Oysteinkrog
parents 683b50af ad3e04c4
This diff is collapsed.
#!/usr/bin/env python3
import sys
import argparse
import json
import os.path
import posixpath
from string import Template
from itertools import groupby
from functools import partial
import urllib.request
import urllib.parse
from constants import OSKind, Product, WinSeries, DATAFILE_PATH, \
DRIVER_URL_TEMPLATE, DRIVER_DIR_PREFIX, BASE_PATH, REPO_BASE
from utils import find_driver, linux_driver_key, windows_driver_key
def posixpath_components(path):
result = []
while True:
head, tail = posixpath.split(path)
if head == path:
break
result.append(tail)
path = head
result.reverse()
if result and not result[-1]:
result.pop()
return result
def validate_patch(patch64, patch32):
wc_base = os.path.abspath(os.path.join(BASE_PATH, "..", ".."))
base_parse = urllib.parse.urlsplit(REPO_BASE, scheme='http')
p64_parse = urllib.parse.urlsplit(patch64, scheme='http')
p32_parse = urllib.parse.urlsplit(patch32, scheme='http')
if not (p64_parse[0] == p32_parse[0] == base_parse[0]):
raise Exception("URL scheme doesn't match repo base URL scheme")
if not (p64_parse[1] == p32_parse[1] == base_parse[1]):
raise Exception("URL network location doesn't match repo base URL network location")
if posixpath.commonpath((base_parse[2], p64_parse[2], p32_parse[2])) != \
posixpath.commonpath((base_parse[2],)):
raise Exception("URL is not subpath of repo base path")
p64_posix_relpath = posixpath.relpath(p64_parse[2], base_parse[2])
p32_posix_relpath = posixpath.relpath(p32_parse[2], base_parse[2])
p64_comp = posixpath_components(p64_posix_relpath)
p32_comp = posixpath_components(p32_posix_relpath)
p64_filepath = os.path.join(wc_base, *p64_comp)
p32_filepath = os.path.join(wc_base, *p32_comp)
if not os.path.exists(p64_filepath):
raise Exception("File %s not found!" % p64_filepath)
if not os.path.exists(p32_filepath):
raise Exception("File %s not found!" % p32_filepath)
if os.path.getsize(p64_filepath) == 0:
raise Exception("File %s empty!" % p64_filepath)
if os.path.exists(p32_filepath) == 0:
raise Exception("File %s empty!" % p32_filepath)
def main():
with open(DATAFILE_PATH) as data_file:
data = json.load(data_file)
drivers = data[OSKind.Windows.value]['x86_64']['drivers']
for d in drivers:
base, sep, tail = d['patch64_url'].rpartition('/')
assert sep
assert tail
d['patch64_url'] = base + '/' + 'nvencodeapi64.1337'
d['patch32_url'] = base + '/' + 'nvencodeapi.1337'
d['driver_url'] = d['driver_url']
validate_patch(d['patch64_url'], d['patch32_url'])
with open(DATAFILE_PATH, 'w') as data_file:
json.dump(data, data_file, indent=4)
if __name__ == '__main__':
main()
......@@ -27,11 +27,9 @@ Requirements:
3. Save appropriate patch(es) from [Version Table](#version-table) using direct link to the patch (Right Click -> Save as...). Alternatively you may checkout repo using git or download it as ZIP archive and then locate corresponding .1337 patch file in `win` directory.
4. Apply x64 library patch to corresponding file in `%WINDIR%\system32\` with the Win\_1337\_Apply\_Patch tool. File name of patched object is specified in first line of .1337 patch. If x86 (32 bit) library patch is also available, apply it to same file in `%WINDIR%\SysWOW64\`.
E.g, for 64bit Windows 10 running driver version $latest_geforce_version use `win10_x64/$latest_geforce_version/nvcuvid64.1337` against `C:\WINDOWS\system32\nvcuvid.dll` and `win10_x64/$latest_geforce_version/nvcuvid32.1337` against `C:\WINDOWS\SysWOW64\nvcuvid.dll`.
E.g, for 64bit Windows 10 running driver version $latest_geforce_version use `win10_x64/$latest_geforce_version/nvencodeapi64.1337` against `C:\WINDOWS\system32\nvencodeapi64.dll` and `win10_x64/$latest_geforce_version/nvencodeapi.1337` against `C:\WINDOWS\SysWOW64\nvencodeapi.dll`.
~~There are additional steps may be required for Plex and 32bit apps users. See [corresponding section below](#d3d11-and-32-bit-apps-encoding-sessions).~~ We hope this is obsoleted by new additional x86 (32bit) library patch.
A video tutorial is also available. Credits to designator2009. (*Covers pre-x86 patches. Now we probably don't need to autorun executable if x86 library patch applied*)
A video tutorial is also available. Credits to designator2009. (*Covers older patches. Now we probably don't need to autorun executable if x86 library patch applied*)
[![Video Tutorial](https://gist.githubusercontent.com/Snawoot/de26b6ccfe67c7bc89ea4347d7c2ecde/raw/50cd87a72c4e13214e6c609dc5291037bed9db8d/ss.jpg)](https://www.youtube.com/watch?v=y7TRfRsJR-w)
......@@ -42,33 +40,3 @@ $version_table
## Benchmarks
* [Plex Media Server: nVidia Hardware Transcoding Calculator for Plex Estimates](https://www.elpamsoft.com/?p=Plex-Hardware-Transcoding) - useful benchmark of achieved simultaneous transcodes with various stream quality and hardware with patched drivers.
## See also
* Genesis in [related issue](https://github.com/keylase/nvidia-patch/issues/9)
### D3D11 and 32-bit apps encoding sessions
This section is actual only for D3D11 encoders and earlier driver versions (before 440.97).
This patch for earlier driver versions (those which do not have additional 32bit library patch) wasn't covering 32bit driver libraries and for this reason 32bit applications were limited unless limit is not raised by some 64bit applications. But once usage limit was exceeded, it persists for all kinds of apps until system reboot. So, for example, you may once open 10 sessions with 64bit version of `ffmpeg` and limit will get raised to 10 for all rest types of apps until reboot. You may follow these steps to achieve this automatically and have all limits raised (assuming patch above already applied):
#### Method 1 (recommended)
1. Download and run [latest release](https://github.com/jantenhove/NvencSessionLimitBump/releases) of [NvencSessionLimitBump](https://github.com/jantenhove/NvencSessionLimitBump).
2. (Optional) Add it to autostart programs.
By default this application raises limit to 32 encoding sessions. Credits to @jantenhove.
#### Method 2 (alternative)
1. Download 64bit FFmpeg for Windows: https://ffmpeg.zeranoe.com/builds/
2. Unpack it somewhere.
3. Get [`ffmpeg_null_10streams.cmd`](ffmpeg_null_10streams.cmd) from this repo.
4. Edit `ffmpeg_null_10streams.cmd` and set executable path to real location of your unpacked ffmpeg.
5. (Optional) Add `ffmpeg_null_10streams.cmd` to autostart programs.
**Bonus**: you may use [this AutoIt script](silent_bump.au3) from @wazerstar for silent startup of console applications bumping sessions.
Also you may use these methods to check if patch applied correctly and limit was raised. Use them when nothing works and you are in doubt.
This diff is collapsed.
......@@ -32,37 +32,37 @@ def parse_args():
parser.add_argument("-T", "--target",
nargs="+",
default=[
"Display.Driver/nvcuvid64.dl_",
"Display.Driver/nvcuvid32.dl_",
"Display.Driver/nvencodeapi64.dl_",
"Display.Driver/nvencodeapi.dl_",
],
help="target location(s) in archive")
parser.add_argument("-N", "--target-name",
nargs="+",
default=[
"nvcuvid.dll",
"nvcuvid.dll",
"nvencodeapi64.dll",
"nvencodeapi.dll",
],
help="name(s) of installed target file. Used for patch "
"header")
parser.add_argument("-P", "--patch-name",
nargs="+",
default=[
"nvcuvid64.1337",
"nvcuvid32.1337",
"nvencodeapi64.1337",
"nvencodeapi.1337",
],
help="relative filename(s) of generated patch(es)")
parser.add_argument("-S", "--search",
nargs="+",
default=[
"FF909800000084C075",
"8B404CFFD084C075",
"8BF085C0750549892FEB",
"89450885C075048937EB",
],
help="representation of search pattern(s) binary string")
parser.add_argument("-R", "--replacement",
nargs="+",
default=[
"FF90980000000C0175",
"8B404CFFD00C0175",
"33C08BF0750549892FEB",
"33C089450875048937EB",
],
help="representation of replacement(s) binary string")
parser.add_argument("-o", "--stdout",
......
#!/bin/bash
DIR="$(dirname $0)"
AP="$DIR/autopatch.py"
"$AP" -S 8BF085C0750549892FEB 8BD885DB75048937EB \
-R 33C08BF0750549892FEB 33C08BD875048937EB \
-T 'Display.Driver/nvencodeapi64.dl_' 'Display.Driver/nvencodeapi.dl_' \
-N 'nvencodeapi64.dll' 'nvencodeapi.dll' \
-P 'nvencodeapi64.1337' 'nvencodeapi.1337' \
"$@"
>nvcuvid.dll
00000000000DDE66:74->90
00000000000DDE67:08->90
\ No newline at end of file
>nvencodeapi.dll
00000000000254B6:89->33
00000000000254B7:45->C0
00000000000254B8:08->89
00000000000254B9:85->45
00000000000254BA:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A71A:8B->33
000000000002A71B:F0->C0
000000000002A71C:85->8B
000000000002A71D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DDE66:74->90
00000000000DDE67:08->90
\ No newline at end of file
>nvencodeapi.dll
00000000000254B6:89->33
00000000000254B7:45->C0
00000000000254B8:08->89
00000000000254B9:85->45
00000000000254BA:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A71A:8B->33
000000000002A71B:F0->C0
000000000002A71C:85->8B
000000000002A71D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DDE66:74->90
00000000000DDE67:08->90
\ No newline at end of file
>nvencodeapi.dll
00000000000254B6:89->33
00000000000254B7:45->C0
00000000000254B8:08->89
00000000000254B9:85->45
00000000000254BA:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A71A:8B->33
000000000002A71B:F0->C0
000000000002A71C:85->8B
000000000002A71D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DE736:74->90
00000000000DE737:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DE736:74->90
00000000000DE737:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DEAA6:74->90
00000000000DEAA7:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DEBB6:74->90
00000000000DEBB7:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DEBB6:74->90
00000000000DEBB7:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DECC6:74->90
00000000000DECC7:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E3477:74->90
00000000000E3478:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000028F16:89->33
0000000000028F17:45->C0
0000000000028F18:08->89
0000000000028F19:85->45
0000000000028F1A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002D74A:8B->33
000000000002D74B:F0->C0
000000000002D74C:85->8B
000000000002D74D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E3477:74->90
00000000000E3478:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000028F16:89->33
0000000000028F17:45->C0
0000000000028F18:08->89
0000000000028F19:85->45
0000000000028F1A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002D74A:8B->33
000000000002D74B:F0->C0
000000000002D74C:85->8B
000000000002D74D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E35C7:74->90
00000000000E35C8:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000028F16:89->33
0000000000028F17:45->C0
0000000000028F18:08->89
0000000000028F19:85->45
0000000000028F1A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002D74A:8B->33
000000000002D74B:F0->C0
000000000002D74C:85->8B
000000000002D74D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E35C7:74->90
00000000000E35C8:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000028F16:89->33
0000000000028F17:45->C0
0000000000028F18:08->89
0000000000028F19:85->45
0000000000028F1A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002D74A:8B->33
000000000002D74B:F0->C0
000000000002D74C:85->8B
000000000002D74D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E41F7:74->90
00000000000E41F8:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029626:89->33
0000000000029627:45->C0
0000000000029628:08->89
0000000000029629:85->45
000000000002962A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002DE5A:8B->33
000000000002DE5B:F0->C0
000000000002DE5C:85->8B
000000000002DE5D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E9955:74->90
00000000000E9956:08->90
\ No newline at end of file
>nvcuvid.dll
00000000000E5C97:74->90
00000000000E5C98:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029C76:89->33
0000000000029C77:45->C0
0000000000029C78:08->89
0000000000029C79:85->45
0000000000029C7A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E30A:8B->33
000000000002E30B:F0->C0
000000000002E30C:85->8B
000000000002E30D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E5C97:74->90
00000000000E5C98:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029C76:89->33
0000000000029C77:45->C0
0000000000029C78:08->89
0000000000029C79:85->45
0000000000029C7A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E30A:8B->33
000000000002E30B:F0->C0
000000000002E30C:85->8B
000000000002E30D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E5C97:74->90
00000000000E5C98:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029C76:89->33
0000000000029C77:45->C0
0000000000029C78:08->89
0000000000029C79:85->45
0000000000029C7A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E30A:8B->33
000000000002E30B:F0->C0
000000000002E30C:85->8B
000000000002E30D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E5C97:74->90
00000000000E5C98:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029C76:89->33
0000000000029C77:45->C0
0000000000029C78:08->89
0000000000029C79:85->45
0000000000029C7A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E30A:8B->33
000000000002E30B:F0->C0
000000000002E30C:85->8B
000000000002E30D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E6109:84->0C
00000000000E610A:C0->01
\ No newline at end of file
>nvcuvid.dll
00000000000E7A5D:84->0C
00000000000E7A5E:C0->01
\ No newline at end of file
>nvencodeapi.dll
0000000000029D56:89->33
0000000000029D57:45->C0
0000000000029D58:08->89
0000000000029D59:85->45
0000000000029D5A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E43A:8B->33
000000000002E43B:F0->C0
000000000002E43C:85->8B
000000000002E43D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E6109:84->0C
00000000000E610A:C0->01
\ No newline at end of file
>nvcuvid.dll
00000000000E7A5D:84->0C
00000000000E7A5E:C0->01
\ No newline at end of file
>nvencodeapi.dll
0000000000029D56:89->33
0000000000029D57:45->C0
0000000000029D58:08->89
0000000000029D59:85->45
0000000000029D5A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E43A:8B->33
000000000002E43B:F0->C0
000000000002E43C:85->8B
000000000002E43D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E6109:84->0C
00000000000E610A:C0->01
\ No newline at end of file
>nvcuvid.dll
00000000000E7A5D:84->0C
00000000000E7A5E:C0->01
\ No newline at end of file
>nvencodeapi.dll
0000000000029D56:89->33
0000000000029D57:45->C0
0000000000029D58:08->89
0000000000029D59:85->45
0000000000029D5A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E43A:8B->33
000000000002E43B:F0->C0
000000000002E43C:85->8B
000000000002E43D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E6169:84->0C
00000000000E616A:C0->01
\ No newline at end of file
>nvcuvid.dll
00000000000E7AED:84->0C
00000000000E7AEE:C0->01
\ No newline at end of file
>nvencodeapi.dll
0000000000029D56:89->33
0000000000029D57:45->C0
0000000000029D58:08->89
0000000000029D59:85->45
0000000000029D5A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E43A:8B->33
000000000002E43B:F0->C0
000000000002E43C:85->8B
000000000002E43D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DEBB6:74->90
00000000000DEBB7:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000025566:89->33
0000000000025567:45->C0
0000000000025568:08->89
0000000000025569:85->45
000000000002556A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002A7BA:8B->33
000000000002A7BB:F0->C0
000000000002A7BC:85->8B
000000000002A7BD:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E35C7:74->90
00000000000E35C8:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000028F16:89->33
0000000000028F17:45->C0
0000000000028F18:08->89
0000000000028F19:85->45
0000000000028F1A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002D74A:8B->33
000000000002D74B:F0->C0
000000000002D74C:85->8B
000000000002D74D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E41F7:74->90
00000000000E41F8:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029626:89->33
0000000000029627:45->C0
0000000000029628:08->89
0000000000029629:85->45
000000000002962A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002DE5A:8B->33
000000000002DE5B:F0->C0
000000000002DE5C:85->8B
000000000002DE5D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E41F7:74->90
00000000000E41F8:08->90
\ No newline at end of file
>nvencodeapi.dll
0000000000029626:89->33
0000000000029627:45->C0
0000000000029628:08->89
0000000000029629:85->45
000000000002962A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002DE5A:8B->33
000000000002DE5B:F0->C0
000000000002DE5C:85->8B
000000000002DE5D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E6109:84->0C
00000000000E610A:C0->01
\ No newline at end of file
>nvcuvid.dll
00000000000E7A5D:84->0C
00000000000E7A5E:C0->01
\ No newline at end of file
>nvencodeapi.dll
0000000000029D56:89->33
0000000000029D57:45->C0
0000000000029D58:08->89
0000000000029D59:85->45
0000000000029D5A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E43A:8B->33
000000000002E43B:F0->C0
000000000002E43C:85->8B
000000000002E43D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000E6169:84->0C
00000000000E616A:C0->01
\ No newline at end of file
>nvcuvid.dll
00000000000E7AED:84->0C
00000000000E7AEE:C0->01
\ No newline at end of file
>nvencodeapi.dll
0000000000029D56:89->33
0000000000029D57:45->C0
0000000000029D58:08->89
0000000000029D59:85->45
0000000000029D5A:C0->08
\ No newline at end of file
>nvencodeapi64.dll
000000000002E43A:8B->33
000000000002E43B:F0->C0
000000000002E43C:85->8B
000000000002E43D:C0->F0
\ No newline at end of file
>nvcuvid.dll
00000000000DBC66:74->90
00000000000DBC67:08->90
\ No newline at end of file
>nvcuvid.dll
00000000000DBDD6:74->90
00000000000DBDD7:08->90
\ No newline at end of file
>nvcuvid.dll
00000000000DD086:74->90
00000000000DD087:08->90
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment