mirror of
https://github.com/xmrig/xmrig.git
synced 2025-12-16 03:12:45 -05:00
Compare commits
84 Commits
v4.1.0-bet
...
v4.3.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72b7d934f6 | ||
|
|
08e9e834b9 | ||
|
|
c26c4ce714 | ||
|
|
61ab47cc95 | ||
|
|
7db7b3727d | ||
|
|
1d03b942a5 | ||
|
|
ee87f73d5e | ||
|
|
bb7bff9115 | ||
|
|
1e5fdde9ba | ||
|
|
2b29a4c20f | ||
|
|
119e7ea7bf | ||
|
|
58c81be1f1 | ||
|
|
d3b137c817 | ||
|
|
9dce868fb9 | ||
|
|
c4170fbb86 | ||
|
|
2dc4ceae29 | ||
|
|
0e0a26f644 | ||
|
|
68d77b02d7 | ||
|
|
c13c83b902 | ||
|
|
72c9d94390 | ||
|
|
9101469308 | ||
|
|
759573ace3 | ||
|
|
0a1836e5a8 | ||
|
|
8af1075c98 | ||
|
|
91498ec690 | ||
|
|
59b62dcb77 | ||
|
|
10f9b29e03 | ||
|
|
d5af5cf8f8 | ||
|
|
05928ccc25 | ||
|
|
ad6dc876b3 | ||
|
|
207dae418d | ||
|
|
7508411faf | ||
|
|
f34031a984 | ||
|
|
d1aadc2e3b | ||
|
|
6d8cf91568 | ||
|
|
96b2560f79 | ||
|
|
923d47fff0 | ||
|
|
542a27a032 | ||
|
|
a7e8ac6cf8 | ||
|
|
42fd146c2b | ||
|
|
34468782cd | ||
|
|
3badeb56a0 | ||
|
|
bc18b5d0be | ||
|
|
158d2e4302 | ||
|
|
f60118ee79 | ||
|
|
6bc217e985 | ||
|
|
3560b6a3c2 | ||
|
|
77eecdd2c2 | ||
|
|
f4943b77f3 | ||
|
|
c908ef2489 | ||
|
|
d21155f3c6 | ||
|
|
da39ed2ce0 | ||
|
|
06500761fb | ||
|
|
919a6c0cc4 | ||
|
|
467e5115b0 | ||
|
|
c495802f64 | ||
|
|
66e48ed2d7 | ||
|
|
ac4cd3eb9b | ||
|
|
5d73402651 | ||
|
|
427b6516e0 | ||
|
|
eae9009b98 | ||
|
|
166d8dd53c | ||
|
|
680081b93b | ||
|
|
e66eeefb14 | ||
|
|
8e9e8cd169 | ||
|
|
f96538dfba | ||
|
|
9ad174c129 | ||
|
|
17b40ac4ad | ||
|
|
4453727754 | ||
|
|
d086318f4e | ||
|
|
5b7f1fe853 | ||
|
|
4c357d2d60 | ||
|
|
0eb5588454 | ||
|
|
5ba8b43fb8 | ||
|
|
0eb754d76e | ||
|
|
7c463849cc | ||
|
|
daed23422e | ||
|
|
550e332909 | ||
|
|
43f26dcd76 | ||
|
|
e1d1a5226c | ||
|
|
82aaa89ab6 | ||
|
|
aac384f54f | ||
|
|
3cbbc94249 | ||
|
|
cbc08e696f |
20
CHANGELOG.md
20
CHANGELOG.md
@@ -1,3 +1,19 @@
|
|||||||
|
# v4.3.0-beta
|
||||||
|
- [#1227](https://github.com/xmrig/xmrig/pull/1227) Added new algorithm `rx/arq`, RandomX variant for upcoming ArQmA fork.
|
||||||
|
- [#808](https://github.com/xmrig/xmrig/issues/808#issuecomment-539297156) Added experimental support for persistent memory for CPU mining threads.
|
||||||
|
- [#1221](https://github.com/xmrig/xmrig/issues/1221) Improved RandomX dataset memory usage and initialization speed for NUMA machines.
|
||||||
|
|
||||||
|
# v4.2.1-beta
|
||||||
|
- [#1150](https://github.com/xmrig/xmrig/issues/1150) Fixed build on FreeBSD.
|
||||||
|
- [#1175](https://github.com/xmrig/xmrig/issues/1175) Fixed support for systems where total count of NUMA nodes not equal usable nodes count.
|
||||||
|
- [#1199](https://github.com/xmrig/xmrig/issues/1199) Fixed excessive memory allocation for OpenCL threads with low intensity.
|
||||||
|
- [#1212](https://github.com/xmrig/xmrig/issues/1212) Fixed low RandomX performance after fast algorithm switching.
|
||||||
|
|
||||||
|
# v4.2.0-beta
|
||||||
|
- [#1202](https://github.com/xmrig/xmrig/issues/1202) Fixed algorithm verification in donate strategy.
|
||||||
|
- Added per pool option `coin` with single possible value `monero` for pools without algorithm negotiation, for upcoming Monero fork.
|
||||||
|
- Added config option `cpu/max-threads-hint` and command line option `--cpu-max-threads-hint`.
|
||||||
|
|
||||||
# v4.1.0-beta
|
# v4.1.0-beta
|
||||||
- **OpenCL backend disabled by default.**.
|
- **OpenCL backend disabled by default.**.
|
||||||
- [#1183](https://github.com/xmrig/xmrig/issues/1183) Fixed compatibility with systemd.
|
- [#1183](https://github.com/xmrig/xmrig/issues/1183) Fixed compatibility with systemd.
|
||||||
@@ -18,6 +34,10 @@
|
|||||||
- [#268](https://github.com/xmrig/xmrig-amd/pull/268) [#270](https://github.com/xmrig/xmrig-amd/pull/270) [#271](https://github.com/xmrig/xmrig-amd/pull/271) [#273](https://github.com/xmrig/xmrig-amd/pull/273) [#274](https://github.com/xmrig/xmrig-amd/pull/274) [#1171](https://github.com/xmrig/xmrig/pull/1171) Added RandomX support for OpenCL, thanks [@SChernykh](https://github.com/SChernykh).
|
- [#268](https://github.com/xmrig/xmrig-amd/pull/268) [#270](https://github.com/xmrig/xmrig-amd/pull/270) [#271](https://github.com/xmrig/xmrig-amd/pull/271) [#273](https://github.com/xmrig/xmrig-amd/pull/273) [#274](https://github.com/xmrig/xmrig-amd/pull/274) [#1171](https://github.com/xmrig/xmrig/pull/1171) Added RandomX support for OpenCL, thanks [@SChernykh](https://github.com/SChernykh).
|
||||||
- Algorithm `cn/wow` removed, as no longer alive.
|
- Algorithm `cn/wow` removed, as no longer alive.
|
||||||
|
|
||||||
|
# v3.2.0
|
||||||
|
- Added per pool option `coin` with single possible value `monero` for pools without algorithm negotiation, for upcoming Monero fork.
|
||||||
|
- [#1183](https://github.com/xmrig/xmrig/issues/1183) Fixed compatibility with systemd.
|
||||||
|
|
||||||
# v3.1.3
|
# v3.1.3
|
||||||
- [#1180](https://github.com/xmrig/xmrig/issues/1180) Fixed possible duplicated shares after algorithm switching.
|
- [#1180](https://github.com/xmrig/xmrig/issues/1180) Fixed possible duplicated shares after algorithm switching.
|
||||||
- Fixed wrong config file permissions after write (only gcc builds on recent Windows 10 affected).
|
- Fixed wrong config file permissions after write (only gcc builds on recent Windows 10 affected).
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ set(HEADERS
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(HEADERS_CRYPTO
|
set(HEADERS_CRYPTO
|
||||||
|
src/backend/common/interfaces/IMemoryPool.h
|
||||||
src/crypto/cn/asm/CryptonightR_template.h
|
src/crypto/cn/asm/CryptonightR_template.h
|
||||||
src/crypto/cn/c_blake256.h
|
src/crypto/cn/c_blake256.h
|
||||||
src/crypto/cn/c_groestl.h
|
src/crypto/cn/c_groestl.h
|
||||||
@@ -71,7 +72,9 @@ set(HEADERS_CRYPTO
|
|||||||
src/crypto/cn/skein_port.h
|
src/crypto/cn/skein_port.h
|
||||||
src/crypto/cn/soft_aes.h
|
src/crypto/cn/soft_aes.h
|
||||||
src/crypto/common/Algorithm.h
|
src/crypto/common/Algorithm.h
|
||||||
|
src/crypto/common/Coin.h
|
||||||
src/crypto/common/keccak.h
|
src/crypto/common/keccak.h
|
||||||
|
src/crypto/common/MemoryPool.h
|
||||||
src/crypto/common/Nonce.h
|
src/crypto/common/Nonce.h
|
||||||
src/crypto/common/portable/mm_malloc.h
|
src/crypto/common/portable/mm_malloc.h
|
||||||
src/crypto/common/VirtualMemory.h
|
src/crypto/common/VirtualMemory.h
|
||||||
@@ -108,11 +111,24 @@ set(SOURCES_CRYPTO
|
|||||||
src/crypto/cn/CnCtx.cpp
|
src/crypto/cn/CnCtx.cpp
|
||||||
src/crypto/cn/CnHash.cpp
|
src/crypto/cn/CnHash.cpp
|
||||||
src/crypto/common/Algorithm.cpp
|
src/crypto/common/Algorithm.cpp
|
||||||
|
src/crypto/common/Coin.cpp
|
||||||
src/crypto/common/keccak.cpp
|
src/crypto/common/keccak.cpp
|
||||||
|
src/crypto/common/MemoryPool.cpp
|
||||||
src/crypto/common/Nonce.cpp
|
src/crypto/common/Nonce.cpp
|
||||||
src/crypto/common/VirtualMemory.cpp
|
src/crypto/common/VirtualMemory.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (WITH_HWLOC)
|
||||||
|
list(APPEND HEADERS_CRYPTO
|
||||||
|
src/crypto/common/NUMAMemoryPool.h
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/common/NUMAMemoryPool.cpp
|
||||||
|
src/crypto/common/VirtualMemory_hwloc.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(SOURCES_OS
|
set(SOURCES_OS
|
||||||
"${SOURCES_OS}"
|
"${SOURCES_OS}"
|
||||||
|
|||||||
73
README.md
73
README.md
@@ -1,5 +1,7 @@
|
|||||||
# XMRig
|
# XMRig
|
||||||
|
|
||||||
|
**:warning: [Monero will change PoW algorithm to RandomX on November 30.](https://github.com/xmrig/xmrig/issues/1204)**
|
||||||
|
|
||||||
[](https://github.com/xmrig/xmrig/releases)
|
[](https://github.com/xmrig/xmrig/releases)
|
||||||
[](https://github.com/xmrig/xmrig/releases)
|
[](https://github.com/xmrig/xmrig/releases)
|
||||||
[](https://github.com/xmrig/xmrig/releases)
|
[](https://github.com/xmrig/xmrig/releases)
|
||||||
@@ -26,56 +28,71 @@ XMRig is a high performance RandomX and CryptoNight CPU miner, with official sup
|
|||||||
* Clone with `git clone https://github.com/xmrig/xmrig.git` :hammer: [Build instructions](https://github.com/xmrig/xmrig/wiki/Build).
|
* Clone with `git clone https://github.com/xmrig/xmrig.git` :hammer: [Build instructions](https://github.com/xmrig/xmrig/wiki/Build).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
Preferend way to configure miner is [JSON config file](src/config.json) as more flexible and human frendly, command line interface not cover all features, for example mining profiles for different algorithms. Most impotant options can be changed in runtime without miner restart by editing config or via API.
|
The preferred way to configure the miner is the [JSON config file](src/config.json) as it is more flexible and human friendly. The command line interface does not cover all features, such as mining profiles for different algorithms. Important options can be changed during runtime without miner restart by editing the config file or executing API calls.
|
||||||
|
|
||||||
### Options
|
### Command line options
|
||||||
```
|
```
|
||||||
-a, --algo=ALGO specify the algorithm to use
|
Network:
|
||||||
cn/r, cn/2, cn/1, cn/0, cn/double, cn/half, cn/fast,
|
|
||||||
cn/rwz, cn/zls, cn/xao, cn/rto, cn/gpu,
|
|
||||||
cn-lite/1,
|
|
||||||
cn-heavy/xhv, cn-heavy/tube, cn-heavy/0,
|
|
||||||
cn-pico,
|
|
||||||
rx/wow, rx/loki
|
|
||||||
-o, --url=URL URL of mining server
|
-o, --url=URL URL of mining server
|
||||||
-O, --userpass=U:P username:password pair for mining server
|
-a, --algo=ALGO mining algorithm https://xmrig.com/docs/algorithms
|
||||||
|
--coin=COIN specify coin instead of algorithm
|
||||||
-u, --user=USERNAME username for mining server
|
-u, --user=USERNAME username for mining server
|
||||||
-p, --pass=PASSWORD password for mining server
|
-p, --pass=PASSWORD password for mining server
|
||||||
--rig-id=ID rig identifier for pool-side statistics (needs pool support)
|
-O, --userpass=U:P username:password pair for mining server
|
||||||
-t, --threads=N number of miner threads
|
|
||||||
-v, --av=N algorithm variation, 0 auto select
|
|
||||||
-k, --keepalive send keepalived packet for prevent timeout (needs pool support)
|
-k, --keepalive send keepalived packet for prevent timeout (needs pool support)
|
||||||
--nicehash enable nicehash.com support
|
--nicehash enable nicehash.com support
|
||||||
|
--rig-id=ID rig identifier for pool-side statistics (needs pool support)
|
||||||
--tls enable SSL/TLS support (needs pool support)
|
--tls enable SSL/TLS support (needs pool support)
|
||||||
--tls-fingerprint=F pool TLS certificate fingerprint, if set enable strict certificate pinning
|
--tls-fingerprint=HEX pool TLS certificate fingerprint for strict certificate pinning
|
||||||
--daemon use daemon RPC instead of pool for solo mining
|
--daemon use daemon RPC instead of pool for solo mining
|
||||||
--daemon-poll-interval=N daemon poll interval in milliseconds (default: 1000)
|
--daemon-poll-interval=N daemon poll interval in milliseconds (default: 1000)
|
||||||
-r, --retries=N number of times to retry before switch to backup server (default: 5)
|
-r, --retries=N number of times to retry before switch to backup server (default: 5)
|
||||||
-R, --retry-pause=N time to pause between retries (default: 5)
|
-R, --retry-pause=N time to pause between retries (default: 5)
|
||||||
|
--user-agent set custom user-agent string for pool
|
||||||
|
--donate-level=N donate level, default 5%% (5 minutes in 100 minutes)
|
||||||
|
--donate-over-proxy=N control donate over xmrig-proxy feature
|
||||||
|
|
||||||
|
CPU backend:
|
||||||
|
--no-cpu disable CPU mining backend
|
||||||
|
-t, --threads=N number of CPU threads
|
||||||
|
-v, --av=N algorithm variation, 0 auto select
|
||||||
--cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1
|
--cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1
|
||||||
--cpu-priority set process priority (0 idle, 2 normal to 5 highest)
|
--cpu-priority set process priority (0 idle, 2 normal to 5 highest)
|
||||||
|
--cpu-max-threads-hint=N maximum CPU threads count (in percentage) hint for autoconfig
|
||||||
|
--cpu-memory-pool=N number of 2 MB pages for persistent memory pool, -1 (auto), 0 (disable)
|
||||||
--no-huge-pages disable huge pages support
|
--no-huge-pages disable huge pages support
|
||||||
--no-color disable colored output
|
--asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer
|
||||||
--donate-level=N donate level, default 5% (5 minutes in 100 minutes)
|
--randomx-init=N threads count to initialize RandomX dataset
|
||||||
--user-agent set custom user-agent string for pool
|
--randomx-no-numa disable NUMA support for RandomX
|
||||||
-B, --background run the miner in the background
|
|
||||||
-c, --config=FILE load a JSON-format configuration file
|
API:
|
||||||
-l, --log-file=FILE log all output to a file
|
|
||||||
--asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer.
|
|
||||||
--print-time=N print hashrate report every N seconds
|
|
||||||
--api-worker-id=ID custom worker-id for API
|
--api-worker-id=ID custom worker-id for API
|
||||||
--api-id=ID custom instance ID for API
|
--api-id=ID custom instance ID for API
|
||||||
--http-enabled enable HTTP API
|
|
||||||
--http-host=HOST bind host for HTTP API (default: 127.0.0.1)
|
--http-host=HOST bind host for HTTP API (default: 127.0.0.1)
|
||||||
--http-port=N bind port for HTTP API
|
--http-port=N bind port for HTTP API
|
||||||
--http-access-token=T access token for HTTP API
|
--http-access-token=T access token for HTTP API
|
||||||
--http-no-restricted enable full remote access to HTTP API (only if access token set)
|
--http-no-restricted enable full remote access to HTTP API (only if access token set)
|
||||||
--randomx-init=N threads count to initialize RandomX dataset
|
|
||||||
--randomx-no-numa disable NUMA support for RandomX
|
OpenCL backend:
|
||||||
--export-topology export hwloc topology to a XML file and exit
|
--opencl enable OpenCL mining backend
|
||||||
--dry-run test configuration and exit
|
--opencl-devices=N list of OpenCL devices to use
|
||||||
-h, --help display this help and exit
|
--opencl-platform=N OpenCL platform index or name
|
||||||
|
--opencl-loader=N path to OpenCL-ICD-Loader (OpenCL.dll or libOpenCL.so)
|
||||||
|
--opencl-no-cache disable OpenCL cache
|
||||||
|
--print-platforms print available OpenCL platforms and exit
|
||||||
|
|
||||||
|
Logging:
|
||||||
|
-l, --log-file=FILE log all output to a file
|
||||||
|
--print-time=N print hashrate report every N seconds
|
||||||
|
--no-color disable colored output
|
||||||
|
|
||||||
|
Misc:
|
||||||
|
-c, --config=FILE load a JSON-format configuration file
|
||||||
|
-B, --background run the miner in the background
|
||||||
-V, --version output version information and exit
|
-V, --version output version information and exit
|
||||||
|
-h, --help display this help and exit
|
||||||
|
--dry-run test configuration and exit
|
||||||
|
--export-topology export hwloc topology to a XML file and exit
|
||||||
```
|
```
|
||||||
|
|
||||||
## Donations
|
## Donations
|
||||||
|
|||||||
@@ -4,9 +4,12 @@ if (WITH_RANDOMX)
|
|||||||
list(APPEND HEADERS_CRYPTO
|
list(APPEND HEADERS_CRYPTO
|
||||||
src/crypto/rx/Rx.h
|
src/crypto/rx/Rx.h
|
||||||
src/crypto/rx/RxAlgo.h
|
src/crypto/rx/RxAlgo.h
|
||||||
|
src/crypto/rx/RxBasicStorage.h
|
||||||
src/crypto/rx/RxCache.h
|
src/crypto/rx/RxCache.h
|
||||||
src/crypto/rx/RxConfig.h
|
src/crypto/rx/RxConfig.h
|
||||||
src/crypto/rx/RxDataset.h
|
src/crypto/rx/RxDataset.h
|
||||||
|
src/crypto/rx/RxQueue.h
|
||||||
|
src/crypto/rx/RxSeed.h
|
||||||
src/crypto/rx/RxVm.h
|
src/crypto/rx/RxVm.h
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -32,9 +35,11 @@ if (WITH_RANDOMX)
|
|||||||
src/crypto/randomx/vm_interpreted.cpp
|
src/crypto/randomx/vm_interpreted.cpp
|
||||||
src/crypto/rx/Rx.cpp
|
src/crypto/rx/Rx.cpp
|
||||||
src/crypto/rx/RxAlgo.cpp
|
src/crypto/rx/RxAlgo.cpp
|
||||||
|
src/crypto/rx/RxBasicStorage.cpp
|
||||||
src/crypto/rx/RxCache.cpp
|
src/crypto/rx/RxCache.cpp
|
||||||
src/crypto/rx/RxConfig.cpp
|
src/crypto/rx/RxConfig.cpp
|
||||||
src/crypto/rx/RxDataset.cpp
|
src/crypto/rx/RxDataset.cpp
|
||||||
|
src/crypto/rx/RxQueue.cpp
|
||||||
src/crypto/rx/RxVm.cpp
|
src/crypto/rx/RxVm.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -63,6 +68,21 @@ if (WITH_RANDOMX)
|
|||||||
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
||||||
set_source_files_properties(src/crypto/randomx/jit_compiler_x86.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-const-variable)
|
set_source_files_properties(src/crypto/randomx/jit_compiler_x86.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-const-variable)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (WITH_HWLOC)
|
||||||
|
list(APPEND HEADERS_CRYPTO
|
||||||
|
src/crypto/rx/RxNUMAStorage.h
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/rx/RxConfig_hwloc.cpp
|
||||||
|
src/crypto/rx/RxNUMAStorage.cpp
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/rx/RxConfig_basic.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
remove_definitions(/DXMRIG_ALGO_RANDOMX)
|
remove_definitions(/DXMRIG_ALGO_RANDOMX)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -1,36 +1,23 @@
|
|||||||
# Algorithms
|
# Algorithms
|
||||||
|
|
||||||
Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
Algorithm can be defined in 3 ways:
|
||||||
|
|
||||||
#### Example
|
1. By pool, using algorithm negotiation, in this case no need specify algorithm on miner side.
|
||||||
```json
|
2. Per pool `coin` option, currently only usable values for this option is `monero` and `arqma`.
|
||||||
{
|
3. Per pool `algo` option.
|
||||||
"pools": [
|
|
||||||
{
|
|
||||||
"url": "...",
|
|
||||||
"algo": "cn/r",
|
|
||||||
...
|
|
||||||
}
|
|
||||||
],
|
|
||||||
...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Pools with mining algorithm negotiation support.
|
Option `coin` useful for pools without algorithm negotiation support or daemon to allow automatically switch algorithm in next hard fork.
|
||||||
|
|
||||||
* [www.hashvault.pro](https://www.hashvault.pro/)
|
## Algorithm names
|
||||||
* [moneroocean.stream](https://moneroocean.stream)
|
|
||||||
|
|
||||||
## Algorithm names
|
|
||||||
|
|
||||||
| Name | Memory | Version | Notes |
|
| Name | Memory | Version | Notes |
|
||||||
|------|--------|---------|-------|
|
|------|--------|---------|-------|
|
||||||
|
| `rx/arq` | 256 KB | 4.3.0+ | RandomARQ (RandomX variant for ArQmA). |
|
||||||
|
| `rx/0` | 2 MB | 3.2.0+ | RandomX (Monero). |
|
||||||
| `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). |
|
| `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). |
|
||||||
| `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) |
|
| `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) |
|
||||||
| `rx/test` | 2 MB | 3.0.0+ | RandomX (reference configuration). |
|
| `rx/wow` | 1 MB | 3.0.0+ | RandomWOW (RandomX variant for Wownero). |
|
||||||
| `rx/0` | 2 MB | 3.0.0+ | RandomX (reference configuration), reserved for future use. |
|
| `rx/loki` | 2 MB | 3.0.0+ | RandomXL (RandomX variant for Loki). |
|
||||||
| `rx/wow` | 1 MB | 3.0.0+ | RandomWOW. |
|
|
||||||
| `rx/loki` | 2 MB | 3.0.0+ | RandomXL. |
|
|
||||||
| `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. |
|
| `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. |
|
||||||
| `cn/rwz` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation. |
|
| `cn/rwz` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation. |
|
||||||
| `cn/zls` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations. |
|
| `cn/zls` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations. |
|
||||||
@@ -50,3 +37,21 @@ Since version 3 mining [algorithm](#algorithm-names) should specified for each p
|
|||||||
| `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. |
|
| `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. |
|
||||||
| `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. |
|
| `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. |
|
||||||
| `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). |
|
| `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). |
|
||||||
|
|
||||||
|
## Migration to v3
|
||||||
|
Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"url": "...",
|
||||||
|
"algo": "cn/r",
|
||||||
|
"coin": null
|
||||||
|
...
|
||||||
|
}
|
||||||
|
],
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|||||||
@@ -94,3 +94,9 @@ Enable/configure or disable ASM optimizations. Possible values: `true`, `false`,
|
|||||||
|
|
||||||
#### `argon2-impl` (since v3.1.0)
|
#### `argon2-impl` (since v3.1.0)
|
||||||
Allow override automatically detected Argon2 implementation, this option added mostly for debug purposes, default value `null` means autodetect. Other possible values: `"x86_64"`, `"SSE2"`, `"SSSE3"`, `"XOP"`, `"AVX2"`, `"AVX-512F"`. Manual selection has no safe guards, if you CPU not support required instuctions, miner will crash.
|
Allow override automatically detected Argon2 implementation, this option added mostly for debug purposes, default value `null` means autodetect. Other possible values: `"x86_64"`, `"SSE2"`, `"SSSE3"`, `"XOP"`, `"AVX2"`, `"AVX-512F"`. Manual selection has no safe guards, if you CPU not support required instuctions, miner will crash.
|
||||||
|
|
||||||
|
#### `max-threads-hint` (since v4.2.0)
|
||||||
|
Maximum CPU threads count (in percentage) hint for autoconfig. [CPU_MAX_USAGE.md](CPU_MAX_USAGE.md)
|
||||||
|
|
||||||
|
#### `memory-pool` (since v4.3.0)
|
||||||
|
Use continuous, persistent memory block for mining threads, useful for preserve huge pages allocation while algorithm swithing. Default value `false` (feature disabled) or `true` or specific count of 2 MB huge pages.
|
||||||
|
|||||||
26
doc/CPU_MAX_USAGE.md
Normal file
26
doc/CPU_MAX_USAGE.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Maximum CPU usage
|
||||||
|
|
||||||
|
Please read this document carefully, `max-threads-hint` (was known as `max-cpu-usage`) option is most confusing option in the miner with many myth and legends.
|
||||||
|
This option is just hint for automatic configuration and can't precise define CPU usage.
|
||||||
|
|
||||||
|
### Option definition
|
||||||
|
#### Config file:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
...
|
||||||
|
"cpu": {
|
||||||
|
"max-threads-hint": 100,
|
||||||
|
...
|
||||||
|
},
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Command line
|
||||||
|
`--cpu-max-threads-hint 100`
|
||||||
|
|
||||||
|
### Known issues and usage
|
||||||
|
|
||||||
|
* This option has no effect if miner already generated CPU configuration, to prevent config generation use `"autosave":false,`.
|
||||||
|
* Only threads count can be changed, for 1 core CPU this option has no effect, for 2 core CPU only 2 values possible 50% and 100%, for 4 cores: 25%, 50%, 75%, 100%. etc.
|
||||||
|
* You CPU may limited by other factors, eg cache.
|
||||||
@@ -59,6 +59,7 @@ function rx()
|
|||||||
'randomx_constants_monero.h',
|
'randomx_constants_monero.h',
|
||||||
'randomx_constants_wow.h',
|
'randomx_constants_wow.h',
|
||||||
'randomx_constants_loki.h',
|
'randomx_constants_loki.h',
|
||||||
|
'randomx_constants_arqma.h',
|
||||||
'aes.cl',
|
'aes.cl',
|
||||||
'blake2b.cl',
|
'blake2b.cl',
|
||||||
'randomx_vm.cl',
|
'randomx_vm.cl',
|
||||||
|
|||||||
6
src/3rdparty/argon2/CMakeLists.txt
vendored
6
src/3rdparty/argon2/CMakeLists.txt
vendored
@@ -22,7 +22,7 @@ set(ARGON2_X86_64_SOURCES arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flag
|
|||||||
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
||||||
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
||||||
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
|
||||||
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
||||||
set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True)
|
set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True)
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
|||||||
elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
function(add_feature_impl FEATURE GCC_FLAG DEF)
|
function(add_feature_impl FEATURE GCC_FLAG DEF)
|
||||||
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
||||||
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
|
||||||
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
||||||
set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True)
|
set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True)
|
||||||
|
|
||||||
@@ -84,5 +84,5 @@ endif()
|
|||||||
add_library(argon2 STATIC ${ARGON2_SOURCES})
|
add_library(argon2 STATIC ${ARGON2_SOURCES})
|
||||||
target_link_libraries(argon2 ${ARGON2_LIBS})
|
target_link_libraries(argon2 ${ARGON2_LIBS})
|
||||||
|
|
||||||
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
|
||||||
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
|
||||||
|
|||||||
2
src/3rdparty/argon2/lib/argon2.c
vendored
2
src/3rdparty/argon2/lib/argon2.c
vendored
@@ -15,7 +15,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "argon2.h"
|
#include "3rdparty/argon2.h"
|
||||||
#include "encoding.h"
|
#include "encoding.h"
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
|
|||||||
2
src/3rdparty/argon2/lib/core.h
vendored
2
src/3rdparty/argon2/lib/core.h
vendored
@@ -14,7 +14,7 @@
|
|||||||
#ifndef ARGON2_CORE_H
|
#ifndef ARGON2_CORE_H
|
||||||
#define ARGON2_CORE_H
|
#define ARGON2_CORE_H
|
||||||
|
|
||||||
#include "argon2.h"
|
#include "3rdparty/argon2.h"
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define ALIGN(n) __declspec(align(16))
|
#define ALIGN(n) __declspec(align(16))
|
||||||
|
|||||||
2
src/3rdparty/argon2/lib/encoding.h
vendored
2
src/3rdparty/argon2/lib/encoding.h
vendored
@@ -1,6 +1,6 @@
|
|||||||
#ifndef ENCODING_H
|
#ifndef ENCODING_H
|
||||||
#define ENCODING_H
|
#define ENCODING_H
|
||||||
#include "argon2.h"
|
#include "3rdparty/argon2.h"
|
||||||
|
|
||||||
#define ARGON2_MAX_DECODED_LANES UINT32_C(255)
|
#define ARGON2_MAX_DECODED_LANES UINT32_C(255)
|
||||||
#define ARGON2_MIN_DECODED_SALT_LEN UINT32_C(8)
|
#define ARGON2_MIN_DECODED_SALT_LEN UINT32_C(8)
|
||||||
|
|||||||
2
src/3rdparty/argon2/lib/impl-select.c
vendored
2
src/3rdparty/argon2/lib/impl-select.c
vendored
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "impl-select.h"
|
#include "impl-select.h"
|
||||||
|
|
||||||
#include "argon2.h"
|
#include "3rdparty/argon2.h"
|
||||||
|
|
||||||
#define BENCH_SAMPLES 1024
|
#define BENCH_SAMPLES 1024
|
||||||
#define BENCH_MEM_BLOCKS 512
|
#define BENCH_MEM_BLOCKS 512
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
#include "core/config/Config.h"
|
#include "core/config/Config.h"
|
||||||
#include "core/Controller.h"
|
#include "core/Controller.h"
|
||||||
#include "core/Miner.h"
|
#include "core/Miner.h"
|
||||||
#include "crypto/common/VirtualMemory.h"
|
|
||||||
#include "net/Network.h"
|
#include "net/Network.h"
|
||||||
#include "Summary.h"
|
#include "Summary.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
@@ -80,8 +79,6 @@ int xmrig::App::exec()
|
|||||||
m_console = new Console(this);
|
m_console = new Console(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualMemory::init(m_controller->config()->cpu().isHugePages());
|
|
||||||
|
|
||||||
Summary::print(m_controller);
|
Summary::print(m_controller);
|
||||||
|
|
||||||
if (m_controller->config()->isDryRun()) {
|
if (m_controller->config()->isDryRun()) {
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ const char *ocl_tag();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
const char *rx_tag();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,15 +44,25 @@ class Threads
|
|||||||
public:
|
public:
|
||||||
inline bool has(const char *profile) const { return m_profiles.count(profile) > 0; }
|
inline bool has(const char *profile) const { return m_profiles.count(profile) > 0; }
|
||||||
inline bool isDisabled(const Algorithm &algo) const { return m_disabled.count(algo) > 0; }
|
inline bool isDisabled(const Algorithm &algo) const { return m_disabled.count(algo) > 0; }
|
||||||
|
inline bool isEmpty() const { return m_profiles.empty(); }
|
||||||
inline bool isExist(const Algorithm &algo) const { return isDisabled(algo) || m_aliases.count(algo) > 0 || has(algo.shortName()); }
|
inline bool isExist(const Algorithm &algo) const { return isDisabled(algo) || m_aliases.count(algo) > 0 || has(algo.shortName()); }
|
||||||
inline const T &get(const Algorithm &algo, bool strict = false) const { return get(profileName(algo, strict)); }
|
inline const T &get(const Algorithm &algo, bool strict = false) const { return get(profileName(algo, strict)); }
|
||||||
inline void disable(const Algorithm &algo) { m_disabled.insert(algo); }
|
inline void disable(const Algorithm &algo) { m_disabled.insert(algo); }
|
||||||
|
inline void setAlias(const Algorithm &algo, const char *profile) { m_aliases[algo] = profile; }
|
||||||
|
|
||||||
inline void move(const char *profile, T &&threads)
|
inline size_t move(const char *profile, T &&threads)
|
||||||
{
|
{
|
||||||
|
if (has(profile)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t count = threads.count();
|
||||||
|
|
||||||
if (!threads.isEmpty()) {
|
if (!threads.isEmpty()) {
|
||||||
m_profiles.insert({ profile, std::move(threads) });
|
m_profiles.insert({ profile, std::move(threads) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
const T &get(const String &profileName) const;
|
const T &get(const String &profileName) const;
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ xmrig::Worker::Worker(size_t id, int64_t affinity, int priority) :
|
|||||||
m_affinity(affinity),
|
m_affinity(affinity),
|
||||||
m_id(id),
|
m_id(id),
|
||||||
m_hashCount(0),
|
m_hashCount(0),
|
||||||
m_timestamp(0),
|
m_timestamp(0)
|
||||||
m_count(0)
|
|
||||||
{
|
{
|
||||||
m_node = VirtualMemory::bindToNUMANode(affinity);
|
m_node = VirtualMemory::bindToNUMANode(affinity);
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ protected:
|
|||||||
std::atomic<uint64_t> m_hashCount;
|
std::atomic<uint64_t> m_hashCount;
|
||||||
std::atomic<uint64_t> m_timestamp;
|
std::atomic<uint64_t> m_timestamp;
|
||||||
uint32_t m_node = 0;
|
uint32_t m_node = 0;
|
||||||
uint64_t m_count;
|
uint64_t m_count = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ void xmrig::Workers<T>::start(const std::vector<T> &data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
d_ptr->hashrate = new Hashrate(m_workers.size());
|
d_ptr->hashrate = new Hashrate(m_workers.size());
|
||||||
|
Nonce::touch(T::backend());
|
||||||
|
|
||||||
for (Thread<T> *worker : m_workers) {
|
for (Thread<T> *worker : m_workers) {
|
||||||
worker->start(Workers<T>::onReady);
|
worker->start(Workers<T>::onReady);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ set(HEADERS_BACKEND_COMMON
|
|||||||
src/backend/common/Tags.h
|
src/backend/common/Tags.h
|
||||||
src/backend/common/interfaces/IBackend.h
|
src/backend/common/interfaces/IBackend.h
|
||||||
src/backend/common/interfaces/IRxListener.h
|
src/backend/common/interfaces/IRxListener.h
|
||||||
|
src/backend/common/interfaces/IRxStorage.h
|
||||||
src/backend/common/interfaces/IThread.h
|
src/backend/common/interfaces/IThread.h
|
||||||
src/backend/common/interfaces/IWorker.h
|
src/backend/common/interfaces/IWorker.h
|
||||||
src/backend/common/misc/PciTopology.h
|
src/backend/common/misc/PciTopology.h
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2018-2019 tevador <tevador@gmail.com>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -22,47 +24,30 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_OCLRXDATASET_H
|
#ifndef XMRIG_IMEMORYPOOL_H
|
||||||
#define XMRIG_OCLRXDATASET_H
|
#define XMRIG_IMEMORYPOOL_H
|
||||||
|
|
||||||
|
|
||||||
#include "base/tools/Object.h"
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
|
|
||||||
using cl_context = struct _cl_context *;
|
|
||||||
using cl_mem = struct _cl_mem *;
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Job;
|
class IMemoryPool
|
||||||
|
|
||||||
|
|
||||||
class OclRxDataset
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
XMRIG_DISABLE_COPY_MOVE(OclRxDataset)
|
virtual ~IMemoryPool() = default;
|
||||||
|
|
||||||
OclRxDataset() = default;
|
virtual bool isHugePages(uint32_t node) const = 0;
|
||||||
~OclRxDataset();
|
virtual uint8_t *get(size_t size, uint32_t node) = 0;
|
||||||
|
virtual void release(uint32_t node) = 0;
|
||||||
inline cl_mem get() const { return m_dataset; }
|
|
||||||
|
|
||||||
void createBuffer(cl_context ctx,const Job &job, bool host);
|
|
||||||
|
|
||||||
private:
|
|
||||||
cl_mem m_dataset = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
using OclRxDatasetPtr = std::shared_ptr<OclRxDataset>;
|
|
||||||
|
|
||||||
|
|
||||||
} /* namespace xmrig */
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_OCLINTERLEAVE_H */
|
|
||||||
|
#endif /* XMRIG_IMEMORYPOOL_H */
|
||||||
53
src/backend/common/interfaces/IRxStorage.h
Normal file
53
src/backend/common/interfaces/IRxStorage.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2016-2018 XMRig <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_IRXSTORAGE_H
|
||||||
|
#define XMRIG_IRXSTORAGE_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class Job;
|
||||||
|
class RxDataset;
|
||||||
|
class RxSeed;
|
||||||
|
|
||||||
|
|
||||||
|
class IRxStorage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~IRxStorage() = default;
|
||||||
|
|
||||||
|
virtual RxDataset *dataset(const Job &job, uint32_t nodeId) const = 0;
|
||||||
|
virtual std::pair<uint32_t, uint32_t> hugePages() const = 0;
|
||||||
|
virtual void init(const RxSeed &seed, uint32_t threads, bool hugePages) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XMRIG_IRXSTORAGE_H
|
||||||
@@ -111,13 +111,13 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("%s" GREEN_BOLD(" READY") " threads %s%zu/%zu (%zu)" CLEAR " huge pages %s%zu/%zu %1.0f%%" CLEAR " memory " CYAN_BOLD("%zu KB") BLACK_BOLD(" (%" PRIu64 " ms)"),
|
LOG_INFO("%s" GREEN_BOLD(" READY") " threads %s%zu/%zu (%zu)" CLEAR " huge pages %s%1.0f%% %zu/%zu" CLEAR " memory " CYAN_BOLD("%zu KB") BLACK_BOLD(" (%" PRIu64 " ms)"),
|
||||||
tag,
|
tag,
|
||||||
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
||||||
m_started, m_threads, m_ways,
|
m_started, m_threads, m_ways,
|
||||||
(m_hugePages == m_pages ? GREEN_BOLD_S : (m_hugePages == 0 ? RED_BOLD_S : YELLOW_BOLD_S)),
|
(m_hugePages == m_pages ? GREEN_BOLD_S : (m_hugePages == 0 ? RED_BOLD_S : YELLOW_BOLD_S)),
|
||||||
m_hugePages, m_pages,
|
|
||||||
m_hugePages == 0 ? 0.0 : static_cast<double>(m_hugePages) / m_pages * 100.0,
|
m_hugePages == 0 ? 0.0 : static_cast<double>(m_hugePages) / m_pages * 100.0,
|
||||||
|
m_hugePages, m_pages,
|
||||||
memory() / 1024,
|
memory() / 1024,
|
||||||
Chrono::steadyMSecs() - m_ts
|
Chrono::steadyMSecs() - m_ts
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -23,47 +23,27 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/Cpu.h"
|
|
||||||
#include "backend/cpu/CpuConfig.h"
|
#include "backend/cpu/CpuConfig.h"
|
||||||
|
#include "backend/cpu/CpuConfig_gen.h"
|
||||||
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/json/Json.h"
|
#include "base/io/json/Json.h"
|
||||||
#include "rapidjson/document.h"
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static const char *kCn = "cn";
|
|
||||||
static const char *kEnabled = "enabled";
|
static const char *kEnabled = "enabled";
|
||||||
static const char *kHugePages = "huge-pages";
|
static const char *kHugePages = "huge-pages";
|
||||||
static const char *kHwAes = "hw-aes";
|
static const char *kHwAes = "hw-aes";
|
||||||
|
static const char *kMaxThreadsHint = "max-threads-hint";
|
||||||
|
static const char *kMemoryPool = "memory-pool";
|
||||||
static const char *kPriority = "priority";
|
static const char *kPriority = "priority";
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_ASM
|
#ifdef XMRIG_FEATURE_ASM
|
||||||
static const char *kAsm = "asm";
|
static const char *kAsm = "asm";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
static const char *kCnGPU = "cn/gpu";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_LITE
|
|
||||||
static const char *kCnLite = "cn-lite";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_HEAVY
|
|
||||||
static const char *kCnHeavy = "cn-heavy";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_PICO
|
|
||||||
static const char *kCnPico = "cn-pico";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
static const char *kRx = "rx";
|
|
||||||
static const char *kRxWOW = "rx/wow";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_ARGON2
|
#ifdef XMRIG_ALGO_ARGON2
|
||||||
static const char *kArgon2 = "argon2";
|
|
||||||
static const char *kArgon2Impl = "argon2-impl";
|
static const char *kArgon2Impl = "argon2-impl";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -72,11 +52,6 @@ extern template class Threads<CpuThreads>;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::CpuConfig::CpuConfig()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::CpuConfig::isHwAES() const
|
bool xmrig::CpuConfig::isHwAES() const
|
||||||
{
|
{
|
||||||
return (m_aes == AES_AUTO ? (Cpu::info()->hasAES() ? AES_HW : AES_SOFT) : m_aes) == AES_HW;
|
return (m_aes == AES_AUTO ? (Cpu::info()->hasAES() ? AES_HW : AES_SOFT) : m_aes) == AES_HW;
|
||||||
@@ -94,6 +69,11 @@ rapidjson::Value xmrig::CpuConfig::toJSON(rapidjson::Document &doc) const
|
|||||||
obj.AddMember(StringRef(kHugePages), m_hugePages, allocator);
|
obj.AddMember(StringRef(kHugePages), m_hugePages, allocator);
|
||||||
obj.AddMember(StringRef(kHwAes), m_aes == AES_AUTO ? Value(kNullType) : Value(m_aes == AES_HW), allocator);
|
obj.AddMember(StringRef(kHwAes), m_aes == AES_AUTO ? Value(kNullType) : Value(m_aes == AES_HW), allocator);
|
||||||
obj.AddMember(StringRef(kPriority), priority() != -1 ? Value(priority()) : Value(kNullType), allocator);
|
obj.AddMember(StringRef(kPriority), priority() != -1 ? Value(priority()) : Value(kNullType), allocator);
|
||||||
|
obj.AddMember(StringRef(kMemoryPool), m_memoryPool < 1 ? Value(m_memoryPool < 0) : Value(m_memoryPool), allocator);
|
||||||
|
|
||||||
|
if (m_threads.isEmpty()) {
|
||||||
|
obj.AddMember(StringRef(kMaxThreadsHint), m_limit, allocator);
|
||||||
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_ASM
|
# ifdef XMRIG_FEATURE_ASM
|
||||||
obj.AddMember(StringRef(kAsm), m_assembly.toJSON(), allocator);
|
obj.AddMember(StringRef(kAsm), m_assembly.toJSON(), allocator);
|
||||||
@@ -109,6 +89,12 @@ rapidjson::Value xmrig::CpuConfig::toJSON(rapidjson::Document &doc) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t xmrig::CpuConfig::memPoolSize() const
|
||||||
|
{
|
||||||
|
return m_memoryPool < 0 ? Cpu::info()->threads() : m_memoryPool;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm) const
|
std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm) const
|
||||||
{
|
{
|
||||||
std::vector<CpuLaunchData> out;
|
std::vector<CpuLaunchData> out;
|
||||||
@@ -128,14 +114,16 @@ std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::CpuConfig::read(const rapidjson::Value &value, uint32_t version)
|
void xmrig::CpuConfig::read(const rapidjson::Value &value)
|
||||||
{
|
{
|
||||||
if (value.IsObject()) {
|
if (value.IsObject()) {
|
||||||
m_enabled = Json::getBool(value, kEnabled, m_enabled);
|
m_enabled = Json::getBool(value, kEnabled, m_enabled);
|
||||||
m_hugePages = Json::getBool(value, kHugePages, m_hugePages);
|
m_hugePages = Json::getBool(value, kHugePages, m_hugePages);
|
||||||
|
m_limit = Json::getUint(value, kMaxThreadsHint, m_limit);
|
||||||
|
|
||||||
setAesMode(Json::getValue(value, kHwAes));
|
setAesMode(Json::getValue(value, kHwAes));
|
||||||
setPriority(Json::getInt(value, kPriority, -1));
|
setPriority(Json::getInt(value, kPriority, -1));
|
||||||
|
setMemoryPool(Json::getValue(value, kMemoryPool));
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_ASM
|
# ifdef XMRIG_FEATURE_ASM
|
||||||
m_assembly = Json::getValue(value, kAsm);
|
m_assembly = Json::getValue(value, kAsm);
|
||||||
@@ -145,16 +133,14 @@ void xmrig::CpuConfig::read(const rapidjson::Value &value, uint32_t version)
|
|||||||
m_argon2Impl = Json::getString(value, kArgon2Impl);
|
m_argon2Impl = Json::getString(value, kArgon2Impl);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (!m_threads.read(value)) {
|
m_threads.read(value);
|
||||||
|
|
||||||
generate();
|
generate();
|
||||||
}
|
}
|
||||||
|
else if (value.IsBool()) {
|
||||||
|
m_enabled = value.GetBool();
|
||||||
|
|
||||||
if (version == 0) {
|
generate();
|
||||||
generateArgon2();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (value.IsBool() && value.IsFalse()) {
|
|
||||||
m_enabled = false;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
generate();
|
generate();
|
||||||
@@ -164,52 +150,40 @@ void xmrig::CpuConfig::read(const rapidjson::Value &value, uint32_t version)
|
|||||||
|
|
||||||
void xmrig::CpuConfig::generate()
|
void xmrig::CpuConfig::generate()
|
||||||
{
|
{
|
||||||
m_shouldSave = true;
|
if (!isEnabled() || m_threads.has("*")) {
|
||||||
ICpuInfo *cpu = Cpu::info();
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_threads.disable(Algorithm::CN_0);
|
size_t count = 0;
|
||||||
m_threads.move(kCn, cpu->threads(Algorithm::CN_0));
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
count += xmrig::generate<Algorithm::CN>(m_threads, m_limit);
|
||||||
m_threads.move(kCnGPU, cpu->threads(Algorithm::CN_GPU));
|
count += xmrig::generate<Algorithm::CN_LITE>(m_threads, m_limit);
|
||||||
# endif
|
count += xmrig::generate<Algorithm::CN_HEAVY>(m_threads, m_limit);
|
||||||
|
count += xmrig::generate<Algorithm::CN_PICO>(m_threads, m_limit);
|
||||||
|
count += xmrig::generate<Algorithm::RANDOM_X>(m_threads, m_limit);
|
||||||
|
count += xmrig::generate<Algorithm::ARGON2>(m_threads, m_limit);
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_LITE
|
m_shouldSave = count > 0;
|
||||||
m_threads.disable(Algorithm::CN_LITE_0);
|
|
||||||
m_threads.move(kCnLite, cpu->threads(Algorithm::CN_LITE_1));
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_HEAVY
|
|
||||||
m_threads.move(kCnHeavy, cpu->threads(Algorithm::CN_HEAVY_0));
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_PICO
|
|
||||||
m_threads.move(kCnPico, cpu->threads(Algorithm::CN_PICO_0));
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
m_threads.move(kRx, cpu->threads(Algorithm::RX_0));
|
|
||||||
m_threads.move(kRxWOW, cpu->threads(Algorithm::RX_WOW));
|
|
||||||
# endif
|
|
||||||
|
|
||||||
generateArgon2();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::CpuConfig::generateArgon2()
|
void xmrig::CpuConfig::setAesMode(const rapidjson::Value &value)
|
||||||
{
|
{
|
||||||
# ifdef XMRIG_ALGO_ARGON2
|
if (value.IsBool()) {
|
||||||
m_threads.move(kArgon2, Cpu::info()->threads(Algorithm::AR2_CHUKWA));
|
m_aes = value.GetBool() ? AES_HW : AES_SOFT;
|
||||||
# endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::CpuConfig::setAesMode(const rapidjson::Value &aesMode)
|
|
||||||
{
|
|
||||||
if (aesMode.IsBool()) {
|
|
||||||
m_aes = aesMode.GetBool() ? AES_HW : AES_SOFT;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_aes = AES_AUTO;
|
m_aes = AES_AUTO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::CpuConfig::setMemoryPool(const rapidjson::Value &value)
|
||||||
|
{
|
||||||
|
if (value.IsBool()) {
|
||||||
|
m_memoryPool = value.GetBool() ? -1 : 0;
|
||||||
|
}
|
||||||
|
else if (value.IsInt()) {
|
||||||
|
m_memoryPool = value.GetInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,12 +44,13 @@ public:
|
|||||||
AES_SOFT
|
AES_SOFT
|
||||||
};
|
};
|
||||||
|
|
||||||
CpuConfig();
|
CpuConfig() = default;
|
||||||
|
|
||||||
bool isHwAES() const;
|
bool isHwAES() const;
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
|
size_t memPoolSize() const;
|
||||||
std::vector<CpuLaunchData> get(const Miner *miner, const Algorithm &algorithm) const;
|
std::vector<CpuLaunchData> get(const Miner *miner, const Algorithm &algorithm) const;
|
||||||
void read(const rapidjson::Value &value, uint32_t version);
|
void read(const rapidjson::Value &value);
|
||||||
|
|
||||||
inline bool isEnabled() const { return m_enabled; }
|
inline bool isEnabled() const { return m_enabled; }
|
||||||
inline bool isHugePages() const { return m_hugePages; }
|
inline bool isHugePages() const { return m_hugePages; }
|
||||||
@@ -61,8 +62,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void generate();
|
void generate();
|
||||||
void generateArgon2();
|
void setAesMode(const rapidjson::Value &value);
|
||||||
void setAesMode(const rapidjson::Value &aesMode);
|
void setMemoryPool(const rapidjson::Value &value);
|
||||||
|
|
||||||
inline void setPriority(int priority) { m_priority = (priority >= -1 && priority <= 5) ? priority : -1; }
|
inline void setPriority(int priority) { m_priority = (priority >= -1 && priority <= 5) ? priority : -1; }
|
||||||
|
|
||||||
@@ -71,9 +72,11 @@ private:
|
|||||||
bool m_enabled = true;
|
bool m_enabled = true;
|
||||||
bool m_hugePages = true;
|
bool m_hugePages = true;
|
||||||
bool m_shouldSave = false;
|
bool m_shouldSave = false;
|
||||||
|
int m_memoryPool = 0;
|
||||||
int m_priority = -1;
|
int m_priority = -1;
|
||||||
String m_argon2Impl;
|
String m_argon2Impl;
|
||||||
Threads<CpuThreads> m_threads;
|
Threads<CpuThreads> m_threads;
|
||||||
|
uint32_t m_limit = 100;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
149
src/backend/cpu/CpuConfig_gen.h
Normal file
149
src/backend/cpu/CpuConfig_gen.h
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_CPUCONFIG_GEN_H
|
||||||
|
#define XMRIG_CPUCONFIG_GEN_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/common/Threads.h"
|
||||||
|
#include "backend/cpu/Cpu.h"
|
||||||
|
#include "backend/cpu/CpuThreads.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
static inline size_t generate(const char *key, Threads<CpuThreads> &threads, const Algorithm &algorithm, uint32_t limit)
|
||||||
|
{
|
||||||
|
if (threads.isExist(algorithm) || threads.has(key)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return threads.move(key, Cpu::info()->threads(algorithm, limit));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<Algorithm::Family FAMILY>
|
||||||
|
static inline size_t generate(Threads<CpuThreads> &, uint32_t) { return 0; }
|
||||||
|
|
||||||
|
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN>(Threads<CpuThreads> &threads, uint32_t limit)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
count += generate("cn", threads, Algorithm::CN_0, limit);
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::CN_0)) {
|
||||||
|
threads.disable(Algorithm::CN_0);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_CN_GPU
|
||||||
|
count += generate("cn/gpu", threads, Algorithm::CN_GPU, limit);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_CN_LITE
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN_LITE>(Threads<CpuThreads> &threads, uint32_t limit)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
count += generate("cn-lite", threads, Algorithm::CN_LITE_1, limit);
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::CN_LITE_0)) {
|
||||||
|
threads.disable(Algorithm::CN_LITE_0);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_CN_HEAVY
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN_HEAVY>(Threads<CpuThreads> &threads, uint32_t limit)
|
||||||
|
{
|
||||||
|
return generate("cn-heavy", threads, Algorithm::CN_HEAVY_0, limit);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_CN_PICO
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN_PICO>(Threads<CpuThreads> &threads, uint32_t limit)
|
||||||
|
{
|
||||||
|
return generate("cn-pico", threads, Algorithm::CN_PICO_0, limit);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::RANDOM_X>(Threads<CpuThreads> &threads, uint32_t limit)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
auto wow = Cpu::info()->threads(Algorithm::RX_WOW, limit);
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::RX_ARQ)) {
|
||||||
|
auto arq = Cpu::info()->threads(Algorithm::RX_ARQ, limit);
|
||||||
|
if (arq == wow) {
|
||||||
|
threads.setAlias(Algorithm::RX_ARQ, "rx/wow");
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
count += threads.move("rx/arq", std::move(arq));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::RX_WOW)) {
|
||||||
|
count += threads.move("rx/wow", std::move(wow));
|
||||||
|
}
|
||||||
|
|
||||||
|
count += generate("rx", threads, Algorithm::RX_0, limit);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_ARGON2
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::ARGON2>(Threads<CpuThreads> &threads, uint32_t limit)
|
||||||
|
{
|
||||||
|
return generate("argon2", threads, Algorithm::AR2_CHUKWA, limit);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_CPUCONFIG_GEN_H */
|
||||||
@@ -120,6 +120,16 @@ xmrig::CpuThreads::CpuThreads(size_t count, uint32_t intensity)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CpuThreads::isEqual(const CpuThreads &other) const
|
||||||
|
{
|
||||||
|
if (isEmpty() && other.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count() == other.count() && std::equal(m_data.begin(), m_data.end(), other.m_data.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rapidjson::Value xmrig::CpuThreads::toJSON(rapidjson::Document &doc) const
|
rapidjson::Value xmrig::CpuThreads::toJSON(rapidjson::Document &doc) const
|
||||||
{
|
{
|
||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace xmrig {
|
|||||||
class CpuThreads
|
class CpuThreads
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline CpuThreads() {}
|
inline CpuThreads() = default;
|
||||||
inline CpuThreads(size_t count) : m_data(count) {}
|
inline CpuThreads(size_t count) : m_data(count) {}
|
||||||
|
|
||||||
CpuThreads(const rapidjson::Value &value);
|
CpuThreads(const rapidjson::Value &value);
|
||||||
@@ -51,6 +51,10 @@ public:
|
|||||||
inline void add(int64_t affinity, uint32_t intensity) { add(CpuThread(affinity, intensity)); }
|
inline void add(int64_t affinity, uint32_t intensity) { add(CpuThread(affinity, intensity)); }
|
||||||
inline void reserve(size_t capacity) { m_data.reserve(capacity); }
|
inline void reserve(size_t capacity) { m_data.reserve(capacity); }
|
||||||
|
|
||||||
|
inline bool operator!=(const CpuThreads &other) const { return !isEqual(other); }
|
||||||
|
inline bool operator==(const CpuThreads &other) const { return isEqual(other); }
|
||||||
|
|
||||||
|
bool isEqual(const CpuThreads &other) const;
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -62,19 +62,19 @@ xmrig::CpuWorker<N>::CpuWorker(size_t id, const CpuLaunchData &data) :
|
|||||||
m_miner(data.miner),
|
m_miner(data.miner),
|
||||||
m_ctx()
|
m_ctx()
|
||||||
{
|
{
|
||||||
m_memory = new VirtualMemory(m_algorithm.l3() * N, data.hugePages);
|
m_memory = new VirtualMemory(m_algorithm.l3() * N, data.hugePages, true, m_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<size_t N>
|
template<size_t N>
|
||||||
xmrig::CpuWorker<N>::~CpuWorker()
|
xmrig::CpuWorker<N>::~CpuWorker()
|
||||||
{
|
{
|
||||||
CnCtx::release(m_ctx, N);
|
|
||||||
delete m_memory;
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
delete m_vm;
|
delete m_vm;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
CnCtx::release(m_ctx, N);
|
||||||
|
delete m_memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ set(HEADERS_BACKEND_CPU
|
|||||||
src/backend/cpu/Cpu.h
|
src/backend/cpu/Cpu.h
|
||||||
src/backend/cpu/CpuBackend.h
|
src/backend/cpu/CpuBackend.h
|
||||||
src/backend/cpu/CpuConfig.h
|
src/backend/cpu/CpuConfig.h
|
||||||
|
src/backend/cpu/CpuConfig_gen.h
|
||||||
src/backend/cpu/CpuLaunchData.cpp
|
src/backend/cpu/CpuLaunchData.cpp
|
||||||
src/backend/cpu/CpuThread.h
|
src/backend/cpu/CpuThread.h
|
||||||
src/backend/cpu/CpuThreads.h
|
src/backend/cpu/CpuThreads.h
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public:
|
|||||||
virtual bool hasAVX2() const = 0;
|
virtual bool hasAVX2() const = 0;
|
||||||
virtual const char *backend() const = 0;
|
virtual const char *backend() const = 0;
|
||||||
virtual const char *brand() const = 0;
|
virtual const char *brand() const = 0;
|
||||||
virtual CpuThreads threads(const Algorithm &algorithm) const = 0;
|
virtual CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const = 0;
|
||||||
virtual size_t cores() const = 0;
|
virtual size_t cores() const = 0;
|
||||||
virtual size_t L2() const = 0;
|
virtual size_t L2() const = 0;
|
||||||
virtual size_t L3() const = 0;
|
virtual size_t L3() const = 0;
|
||||||
|
|||||||
@@ -23,10 +23,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <assert.h>
|
#include <cassert>
|
||||||
#include <math.h>
|
#include <cmath>
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
|
|
||||||
#include "3rdparty/libcpuid/libcpuid.h"
|
#include "3rdparty/libcpuid/libcpuid.h"
|
||||||
@@ -109,7 +109,7 @@ xmrig::AdvancedCpuInfo::AdvancedCpuInfo() :
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::CpuThreads xmrig::AdvancedCpuInfo::threads(const Algorithm &algorithm) const
|
xmrig::CpuThreads xmrig::AdvancedCpuInfo::threads(const Algorithm &algorithm, uint32_t limit) const
|
||||||
{
|
{
|
||||||
if (threads() == 1) {
|
if (threads() == 1) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -153,5 +153,12 @@ xmrig::CpuThreads xmrig::AdvancedCpuInfo::threads(const Algorithm &algorithm) co
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
return CpuThreads(std::max<size_t>(std::min<size_t>(count, threads()), 1), intensity);
|
if (limit > 0 && limit < 100) {
|
||||||
|
count = std::min(count, static_cast<size_t>(round(threads() * (limit / 100.0))));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
count = std::min(count, threads());
|
||||||
|
}
|
||||||
|
|
||||||
|
return CpuThreads(std::max<size_t>(count, 1), intensity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
AdvancedCpuInfo();
|
AdvancedCpuInfo();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CpuThreads threads(const Algorithm &algorithm) const override;
|
CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override;
|
||||||
|
|
||||||
inline Assembly::Id assembly() const override { return m_assembly; }
|
inline Assembly::Id assembly() const override { return m_assembly; }
|
||||||
inline bool hasAES() const override { return m_aes; }
|
inline bool hasAES() const override { return m_aes; }
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ const char *xmrig::BasicCpuInfo::backend() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm) const
|
xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm, uint32_t limit) const
|
||||||
{
|
{
|
||||||
const size_t count = std::thread::hardware_concurrency();
|
const size_t count = std::thread::hardware_concurrency();
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
const char *backend() const override;
|
const char *backend() const override;
|
||||||
CpuThreads threads(const Algorithm &algorithm) const override;
|
CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override;
|
||||||
|
|
||||||
inline Assembly::Id assembly() const override { return m_assembly; }
|
inline Assembly::Id assembly() const override { return m_assembly; }
|
||||||
inline bool hasAES() const override { return m_aes; }
|
inline bool hasAES() const override { return m_aes; }
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ const char *xmrig::BasicCpuInfo::backend() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &) const
|
xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &, uint32_t) const
|
||||||
{
|
{
|
||||||
return CpuThreads(threads());
|
return CpuThreads(threads());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
#include <hwloc.h>
|
#include <hwloc.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -45,7 +46,6 @@
|
|||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
std::vector<uint32_t> HwlocCpuInfo::m_nodeIndexes;
|
|
||||||
uint32_t HwlocCpuInfo::m_features = 0;
|
uint32_t HwlocCpuInfo::m_features = 0;
|
||||||
|
|
||||||
|
|
||||||
@@ -127,9 +127,7 @@ static inline bool isCacheExclusive(hwloc_obj_t obj)
|
|||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
xmrig::HwlocCpuInfo::HwlocCpuInfo() : BasicCpuInfo(),
|
xmrig::HwlocCpuInfo::HwlocCpuInfo()
|
||||||
m_backend(),
|
|
||||||
m_cache()
|
|
||||||
{
|
{
|
||||||
m_threads = 0;
|
m_threads = 0;
|
||||||
|
|
||||||
@@ -149,7 +147,7 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo() : BasicCpuInfo(),
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
const std::vector<hwloc_obj_t> packages = findByType(hwloc_get_root_obj(m_topology), HWLOC_OBJ_PACKAGE);
|
const std::vector<hwloc_obj_t> packages = findByType(hwloc_get_root_obj(m_topology), HWLOC_OBJ_PACKAGE);
|
||||||
if (packages.size()) {
|
if (!packages.empty()) {
|
||||||
const char *value = hwloc_obj_get_info_by_name(packages[0], "CPUModel");
|
const char *value = hwloc_obj_get_info_by_name(packages[0], "CPUModel");
|
||||||
if (value) {
|
if (value) {
|
||||||
strncpy(m_brand, value, 64);
|
strncpy(m_brand, value, 64);
|
||||||
@@ -178,7 +176,7 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo() : BasicCpuInfo(),
|
|||||||
|
|
||||||
m_threads = countByType(m_topology, HWLOC_OBJ_PU);
|
m_threads = countByType(m_topology, HWLOC_OBJ_PU);
|
||||||
m_cores = countByType(m_topology, HWLOC_OBJ_CORE);
|
m_cores = countByType(m_topology, HWLOC_OBJ_CORE);
|
||||||
m_nodes = std::max<size_t>(countByType(m_topology, HWLOC_OBJ_NUMANODE), 1);
|
m_nodes = std::max(hwloc_bitmap_weight(hwloc_topology_get_complete_nodeset(m_topology)), 1);
|
||||||
m_packages = countByType(m_topology, HWLOC_OBJ_PACKAGE);
|
m_packages = countByType(m_topology, HWLOC_OBJ_PACKAGE);
|
||||||
|
|
||||||
if (m_nodes > 1) {
|
if (m_nodes > 1) {
|
||||||
@@ -186,11 +184,11 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo() : BasicCpuInfo(),
|
|||||||
m_features |= SET_THISTHREAD_MEMBIND;
|
m_features |= SET_THISTHREAD_MEMBIND;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nodeIndexes.reserve(m_nodes);
|
m_nodeset.reserve(m_nodes);
|
||||||
hwloc_obj_t node = nullptr;
|
hwloc_obj_t node = nullptr;
|
||||||
|
|
||||||
while ((node = hwloc_get_next_obj_by_type(m_topology, HWLOC_OBJ_NUMANODE, node)) != nullptr) {
|
while ((node = hwloc_get_next_obj_by_type(m_topology, HWLOC_OBJ_NUMANODE, node)) != nullptr) {
|
||||||
m_nodeIndexes.emplace_back(node->os_index);
|
m_nodeset.emplace_back(node->os_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -202,10 +200,24 @@ xmrig::HwlocCpuInfo::~HwlocCpuInfo()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::CpuThreads xmrig::HwlocCpuInfo::threads(const Algorithm &algorithm) const
|
bool xmrig::HwlocCpuInfo::membind(hwloc_const_bitmap_t nodeset)
|
||||||
|
{
|
||||||
|
if (!hwloc_topology_get_support(m_topology)->membind->set_thisthread_membind) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
# if HWLOC_API_VERSION >= 0x20000
|
||||||
|
return hwloc_set_membind(m_topology, nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_THREAD | HWLOC_MEMBIND_BYNODESET) >= 0;
|
||||||
|
# else
|
||||||
|
return hwloc_set_membind_nodeset(m_topology, nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_THREAD) >= 0;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::CpuThreads xmrig::HwlocCpuInfo::threads(const Algorithm &algorithm, uint32_t limit) const
|
||||||
{
|
{
|
||||||
if (L2() == 0 && L3() == 0) {
|
if (L2() == 0 && L3() == 0) {
|
||||||
return BasicCpuInfo::threads(algorithm);
|
return BasicCpuInfo::threads(algorithm, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned depth = L3() > 0 ? 3 : 2;
|
const unsigned depth = L3() > 0 ? 3 : 2;
|
||||||
@@ -218,21 +230,37 @@ xmrig::CpuThreads xmrig::HwlocCpuInfo::threads(const Algorithm &algorithm) const
|
|||||||
|
|
||||||
findCache(hwloc_get_root_obj(m_topology), depth, depth, [&caches](hwloc_obj_t found) { caches.emplace_back(found); });
|
findCache(hwloc_get_root_obj(m_topology), depth, depth, [&caches](hwloc_obj_t found) { caches.emplace_back(found); });
|
||||||
|
|
||||||
|
if (limit > 0 && limit < 100 && !caches.empty()) {
|
||||||
|
const double maxTotalThreads = round(m_threads * (limit / 100.0));
|
||||||
|
const auto maxPerCache = std::max(static_cast<int>(round(maxTotalThreads / caches.size())), 1);
|
||||||
|
int remaining = std::max(static_cast<int>(maxTotalThreads), 1);
|
||||||
|
|
||||||
for (hwloc_obj_t cache : caches) {
|
for (hwloc_obj_t cache : caches) {
|
||||||
processTopLevelCache(cache, algorithm, threads);
|
processTopLevelCache(cache, algorithm, threads, std::min(maxPerCache, remaining));
|
||||||
|
|
||||||
|
remaining -= maxPerCache;
|
||||||
|
if (remaining <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (hwloc_obj_t cache : caches) {
|
||||||
|
processTopLevelCache(cache, algorithm, threads, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (threads.isEmpty()) {
|
if (threads.isEmpty()) {
|
||||||
LOG_WARN("hwloc auto configuration for algorithm \"%s\" failed.", algorithm.shortName());
|
LOG_WARN("hwloc auto configuration for algorithm \"%s\" failed.", algorithm.shortName());
|
||||||
|
|
||||||
return BasicCpuInfo::threads(algorithm);
|
return BasicCpuInfo::threads(algorithm, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
return threads;
|
return threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorithm &algorithm, CpuThreads &threads) const
|
void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const
|
||||||
{
|
{
|
||||||
constexpr size_t oneMiB = 1024u * 1024u;
|
constexpr size_t oneMiB = 1024u * 1024u;
|
||||||
|
|
||||||
@@ -296,6 +324,10 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
if (limit > 0) {
|
||||||
|
cacheHashes = std::min(cacheHashes, limit);
|
||||||
|
}
|
||||||
|
|
||||||
if (cacheHashes >= PUs) {
|
if (cacheHashes >= PUs) {
|
||||||
for (hwloc_obj_t core : cores) {
|
for (hwloc_obj_t core : cores) {
|
||||||
const std::vector<hwloc_obj_t> units = findByType(core, HWLOC_OBJ_PU);
|
const std::vector<hwloc_obj_t> units = findByType(core, HWLOC_OBJ_PU);
|
||||||
|
|||||||
@@ -27,10 +27,12 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/platform/BasicCpuInfo.h"
|
#include "backend/cpu/platform/BasicCpuInfo.h"
|
||||||
|
#include "base/tools/Object.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct hwloc_obj *hwloc_obj_t;
|
using hwloc_const_bitmap_t = const struct hwloc_bitmap_s *;
|
||||||
typedef struct hwloc_topology *hwloc_topology_t;
|
using hwloc_obj_t = struct hwloc_obj *;
|
||||||
|
using hwloc_topology_t = struct hwloc_topology *;
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
@@ -39,6 +41,9 @@ namespace xmrig {
|
|||||||
class HwlocCpuInfo : public BasicCpuInfo
|
class HwlocCpuInfo : public BasicCpuInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE(HwlocCpuInfo)
|
||||||
|
|
||||||
|
|
||||||
enum Feature : uint32_t {
|
enum Feature : uint32_t {
|
||||||
SET_THISTHREAD_MEMBIND = 1
|
SET_THISTHREAD_MEMBIND = 1
|
||||||
};
|
};
|
||||||
@@ -48,10 +53,14 @@ public:
|
|||||||
~HwlocCpuInfo() override;
|
~HwlocCpuInfo() override;
|
||||||
|
|
||||||
static inline bool has(Feature feature) { return m_features & feature; }
|
static inline bool has(Feature feature) { return m_features & feature; }
|
||||||
static inline const std::vector<uint32_t> &nodeIndexes() { return m_nodeIndexes; }
|
|
||||||
|
inline const std::vector<uint32_t> &nodeset() const { return m_nodeset; }
|
||||||
|
inline hwloc_topology_t topology() const { return m_topology; }
|
||||||
|
|
||||||
|
bool membind(hwloc_const_bitmap_t nodeset);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CpuThreads threads(const Algorithm &algorithm) const override;
|
CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override;
|
||||||
|
|
||||||
inline const char *backend() const override { return m_backend; }
|
inline const char *backend() const override { return m_backend; }
|
||||||
inline size_t cores() const override { return m_cores; }
|
inline size_t cores() const override { return m_cores; }
|
||||||
@@ -61,17 +70,18 @@ protected:
|
|||||||
inline size_t packages() const override { return m_packages; }
|
inline size_t packages() const override { return m_packages; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void processTopLevelCache(hwloc_obj_t obj, const Algorithm &algorithm, CpuThreads &threads) const;
|
void processTopLevelCache(hwloc_obj_t obj, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const;
|
||||||
|
|
||||||
|
|
||||||
static std::vector<uint32_t> m_nodeIndexes;
|
|
||||||
static uint32_t m_features;
|
static uint32_t m_features;
|
||||||
|
|
||||||
char m_backend[20];
|
char m_backend[20] = { 0 };
|
||||||
hwloc_topology_t m_topology;
|
hwloc_topology_t m_topology = nullptr;
|
||||||
size_t m_cache[5];
|
size_t m_cache[5] = { 0 };
|
||||||
size_t m_cores = 0;
|
size_t m_cores = 0;
|
||||||
size_t m_nodes = 0;
|
size_t m_nodes = 0;
|
||||||
size_t m_packages = 0;
|
size_t m_packages = 0;
|
||||||
|
std::vector<uint32_t> m_nodeset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#include "backend/opencl/OclConfig.h"
|
#include "backend/opencl/OclConfig.h"
|
||||||
#include "backend/opencl/OclLaunchData.h"
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
#include "backend/opencl/OclWorker.h"
|
#include "backend/opencl/OclWorker.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
#include "backend/opencl/wrappers/OclContext.h"
|
#include "backend/opencl/wrappers/OclContext.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
@@ -164,7 +165,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void start()
|
inline void start(const Job &job)
|
||||||
{
|
{
|
||||||
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" threads)") " scratchpad " CYAN_BOLD("%zu KB"),
|
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" threads)") " scratchpad " CYAN_BOLD("%zu KB"),
|
||||||
tag,
|
tag,
|
||||||
@@ -194,6 +195,8 @@ public:
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OclSharedState::start(threads, job);
|
||||||
|
|
||||||
status.start(threads.size());
|
status.start(threads.size());
|
||||||
workers.start(threads);
|
workers.start(threads);
|
||||||
}
|
}
|
||||||
@@ -329,7 +332,7 @@ void xmrig::OclBackend::setJob(const Job &job)
|
|||||||
return stop();
|
return stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!d_ptr->context.init(d_ptr->devices, threads, job)) {
|
if (!d_ptr->context.init(d_ptr->devices, threads)) {
|
||||||
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (OpenCL context unavailable)"), tag);
|
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (OpenCL context unavailable)"), tag);
|
||||||
|
|
||||||
return stop();
|
return stop();
|
||||||
@@ -338,7 +341,7 @@ void xmrig::OclBackend::setJob(const Job &job)
|
|||||||
stop();
|
stop();
|
||||||
|
|
||||||
d_ptr->threads = std::move(threads);
|
d_ptr->threads = std::move(threads);
|
||||||
d_ptr->start();
|
d_ptr->start(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -371,6 +374,8 @@ void xmrig::OclBackend::stop()
|
|||||||
d_ptr->workers.stop();
|
d_ptr->workers.stop();
|
||||||
d_ptr->threads.clear();
|
d_ptr->threads.clear();
|
||||||
|
|
||||||
|
OclSharedState::release();
|
||||||
|
|
||||||
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts);
|
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,21 +24,18 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/OclConfig.h"
|
#include "backend/opencl/OclConfig.h"
|
||||||
|
#include "backend/opencl/OclConfig_gen.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
#include "base/io/json/Json.h"
|
#include "base/io/json/Json.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "rapidjson/document.h"
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
static const char *kAMD = "AMD";
|
static const char *kAMD = "AMD";
|
||||||
static const char *kCache = "cache";
|
static const char *kCache = "cache";
|
||||||
static const char *kCn = "cn";
|
|
||||||
static const char *kCn2 = "cn/2";
|
|
||||||
static const char *kDevicesHint = "devices-hint";
|
static const char *kDevicesHint = "devices-hint";
|
||||||
static const char *kEnabled = "enabled";
|
static const char *kEnabled = "enabled";
|
||||||
static const char *kINTEL = "INTEL";
|
static const char *kINTEL = "INTEL";
|
||||||
@@ -47,69 +44,9 @@ static const char *kNVIDIA = "NVIDIA";
|
|||||||
static const char *kPlatform = "platform";
|
static const char *kPlatform = "platform";
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
static const char *kCnGPU = "cn/gpu";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_LITE
|
|
||||||
static const char *kCnLite = "cn-lite";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_HEAVY
|
|
||||||
static const char *kCnHeavy = "cn-heavy";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_PICO
|
|
||||||
static const char *kCnPico = "cn-pico";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
static const char *kRx = "rx";
|
|
||||||
static const char *kRxWOW = "rx/wow";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_ARGON2
|
|
||||||
//static const char *kArgon2 = "argon2";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
extern template class Threads<OclThreads>;
|
extern template class Threads<OclThreads>;
|
||||||
|
|
||||||
|
|
||||||
static size_t generate(const char *key, Threads<OclThreads> &threads, const Algorithm &algorithm, const std::vector<OclDevice> &devices)
|
|
||||||
{
|
|
||||||
if (threads.has(key) || threads.isExist(algorithm)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
OclThreads profile;
|
|
||||||
for (const OclDevice &device : devices) {
|
|
||||||
device.generate(algorithm, profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
const size_t count = profile.count();
|
|
||||||
threads.move(key, std::move(profile));
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static inline std::vector<OclDevice> filterDevices(const std::vector<OclDevice> &devices, const std::vector<uint32_t> &hints)
|
|
||||||
{
|
|
||||||
std::vector<OclDevice> out;
|
|
||||||
out.reserve(std::min(devices.size(), hints.size()));
|
|
||||||
|
|
||||||
for (const auto &device : devices) {
|
|
||||||
auto it = std::find(hints.begin(), hints.end(), device.index());
|
|
||||||
if (it != hints.end()) {
|
|
||||||
out.emplace_back(device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -193,32 +130,13 @@ std::vector<xmrig::OclLaunchData> xmrig::OclConfig::get(const Miner *miner, cons
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
auto dataset = algorithm.family() == Algorithm::RANDOM_X ? std::make_shared<OclRxDataset>() : nullptr;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
if (thread.threads().size() > 1) {
|
if (thread.threads().size() > 1) {
|
||||||
auto interleave = std::make_shared<OclInterleave>(thread.threads().size());
|
|
||||||
|
|
||||||
for (int64_t affinity : thread.threads()) {
|
for (int64_t affinity : thread.threads()) {
|
||||||
OclLaunchData data(miner, algorithm, *this, platform, thread, devices[thread.index()], affinity);
|
out.emplace_back(miner, algorithm, *this, platform, thread, devices[thread.index()], affinity);
|
||||||
data.interleave = interleave;
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
data.dataset = dataset;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
out.emplace_back(std::move(data));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
OclLaunchData data(miner, algorithm, *this, platform, thread, devices[thread.index()], thread.threads().front());
|
out.emplace_back(miner, algorithm, *this, platform, thread, devices[thread.index()], thread.threads().front());
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
data.dataset = dataset;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
out.emplace_back(std::move(data));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,39 +188,11 @@ void xmrig::OclConfig::generate()
|
|||||||
|
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
count += xmrig::generate(kCn, m_threads, Algorithm::CN_0, devices);
|
count += xmrig::generate<Algorithm::CN>(m_threads, devices);
|
||||||
count += xmrig::generate(kCn2, m_threads, Algorithm::CN_2, devices);
|
count += xmrig::generate<Algorithm::CN_LITE>(m_threads, devices);
|
||||||
|
count += xmrig::generate<Algorithm::CN_HEAVY>(m_threads, devices);
|
||||||
if (!m_threads.isExist(Algorithm::CN_0)) {
|
count += xmrig::generate<Algorithm::CN_PICO>(m_threads, devices);
|
||||||
m_threads.disable(Algorithm::CN_0);
|
count += xmrig::generate<Algorithm::RANDOM_X>(m_threads, devices);
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
count += xmrig::generate(kCnGPU, m_threads, Algorithm::CN_GPU, devices);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_LITE
|
|
||||||
count += xmrig::generate(kCnLite, m_threads, Algorithm::CN_LITE_1, devices);
|
|
||||||
|
|
||||||
if (!m_threads.isExist(Algorithm::CN_LITE_0)) {
|
|
||||||
m_threads.disable(Algorithm::CN_LITE_0);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_HEAVY
|
|
||||||
count += xmrig::generate(kCnHeavy, m_threads, Algorithm::CN_HEAVY_0, devices);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_PICO
|
|
||||||
count += xmrig::generate(kCnPico, m_threads, Algorithm::CN_PICO_0, devices);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
count += xmrig::generate(kRx, m_threads, Algorithm::RX_0, devices);
|
|
||||||
count += xmrig::generate(kRxWOW, m_threads, Algorithm::RX_WOW, devices);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
m_shouldSave = count > 0;
|
m_shouldSave = count > 0;
|
||||||
}
|
}
|
||||||
|
|||||||
152
src/backend/opencl/OclConfig_gen.h
Normal file
152
src/backend/opencl/OclConfig_gen.h
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_OCLCONFIG_GEN_H
|
||||||
|
#define XMRIG_OCLCONFIG_GEN_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/common/Threads.h"
|
||||||
|
#include "backend/opencl/OclThreads.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
static inline size_t generate(const char *key, Threads<OclThreads> &threads, const Algorithm &algorithm, const std::vector<OclDevice> &devices)
|
||||||
|
{
|
||||||
|
if (threads.isExist(algorithm) || threads.has(key)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return threads.move(key, OclThreads(devices, algorithm));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<Algorithm::Family FAMILY>
|
||||||
|
static inline size_t generate(Threads<OclThreads> &, const std::vector<OclDevice> &) { return 0; }
|
||||||
|
|
||||||
|
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN>(Threads<OclThreads> &threads, const std::vector<OclDevice> &devices)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
count += generate("cn", threads, Algorithm::CN_0, devices);
|
||||||
|
count += generate("cn/2", threads, Algorithm::CN_2, devices);
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::CN_0)) {
|
||||||
|
threads.disable(Algorithm::CN_0);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_CN_GPU
|
||||||
|
count += generate("cn/gpu", threads, Algorithm::CN_GPU, devices);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_CN_LITE
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN_LITE>(Threads<OclThreads> &threads, const std::vector<OclDevice> &devices)
|
||||||
|
{
|
||||||
|
size_t count = generate("cn-lite", threads, Algorithm::CN_LITE_1, devices);
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::CN_LITE_0)) {
|
||||||
|
threads.disable(Algorithm::CN_LITE_0);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_CN_HEAVY
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN_HEAVY>(Threads<OclThreads> &threads, const std::vector<OclDevice> &devices)
|
||||||
|
{
|
||||||
|
return generate("cn-heavy", threads, Algorithm::CN_HEAVY_0, devices);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_CN_PICO
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::CN_PICO>(Threads<OclThreads> &threads, const std::vector<OclDevice> &devices)
|
||||||
|
{
|
||||||
|
return generate("cn-pico", threads, Algorithm::CN_PICO_0, devices);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::RANDOM_X>(Threads<OclThreads> &threads, const std::vector<OclDevice> &devices)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
auto rx = OclThreads(devices, Algorithm::RX_0);
|
||||||
|
auto wow = OclThreads(devices, Algorithm::RX_WOW);
|
||||||
|
auto arq = OclThreads(devices, Algorithm::RX_ARQ);
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::RX_WOW) && wow != rx) {
|
||||||
|
count += threads.move("rx/wow", std::move(wow));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!threads.isExist(Algorithm::RX_ARQ) && arq != rx) {
|
||||||
|
count += threads.move("rx/arq", std::move(arq));
|
||||||
|
}
|
||||||
|
|
||||||
|
count += threads.move("rx", std::move(rx));
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static inline std::vector<OclDevice> filterDevices(const std::vector<OclDevice> &devices, const std::vector<uint32_t> &hints)
|
||||||
|
{
|
||||||
|
std::vector<OclDevice> out;
|
||||||
|
out.reserve(std::min(devices.size(), hints.size()));
|
||||||
|
|
||||||
|
for (const auto &device : devices) {
|
||||||
|
auto it = std::find(hints.begin(), hints.end(), device.index());
|
||||||
|
if (it != hints.end()) {
|
||||||
|
out.emplace_back(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_OCLCONFIG_GEN_H */
|
||||||
@@ -27,19 +27,14 @@
|
|||||||
#define XMRIG_OCLLAUNCHDATA_H
|
#define XMRIG_OCLLAUNCHDATA_H
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/OclInterleave.h"
|
|
||||||
#include "backend/opencl/OclThread.h"
|
#include "backend/opencl/OclThread.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedData.h"
|
||||||
#include "backend/opencl/wrappers/OclDevice.h"
|
#include "backend/opencl/wrappers/OclDevice.h"
|
||||||
#include "backend/opencl/wrappers/OclPlatform.h"
|
#include "backend/opencl/wrappers/OclPlatform.h"
|
||||||
#include "crypto/common/Algorithm.h"
|
#include "crypto/common/Algorithm.h"
|
||||||
#include "crypto/common/Nonce.h"
|
#include "crypto/common/Nonce.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
# include "backend/opencl/runners/tools/OclRxDataset.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
using cl_context = struct _cl_context *;
|
using cl_context = struct _cl_context *;
|
||||||
|
|
||||||
|
|
||||||
@@ -72,11 +67,6 @@ public:
|
|||||||
const OclDevice device;
|
const OclDevice device;
|
||||||
const OclPlatform platform;
|
const OclPlatform platform;
|
||||||
const OclThread thread;
|
const OclThread thread;
|
||||||
OclInterleavePtr interleave;
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
OclRxDatasetPtr dataset;
|
|
||||||
# endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,24 @@ xmrig::OclThreads::OclThreads(const rapidjson::Value &value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::OclThreads::OclThreads(const std::vector<OclDevice> &devices, const Algorithm &algorithm)
|
||||||
|
{
|
||||||
|
for (const OclDevice &device : devices) {
|
||||||
|
device.generate(algorithm, *this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::OclThreads::isEqual(const OclThreads &other) const
|
||||||
|
{
|
||||||
|
if (isEmpty() && other.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count() == other.count() && std::equal(m_data.begin(), m_data.end(), other.m_data.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rapidjson::Value xmrig::OclThreads::toJSON(rapidjson::Document &doc) const
|
rapidjson::Value xmrig::OclThreads::toJSON(rapidjson::Document &doc) const
|
||||||
{
|
{
|
||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/OclThread.h"
|
#include "backend/opencl/OclThread.h"
|
||||||
|
#include "backend/opencl/wrappers/OclDevice.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
@@ -40,6 +41,7 @@ class OclThreads
|
|||||||
public:
|
public:
|
||||||
OclThreads() = default;
|
OclThreads() = default;
|
||||||
OclThreads(const rapidjson::Value &value);
|
OclThreads(const rapidjson::Value &value);
|
||||||
|
OclThreads(const std::vector<OclDevice> &devices, const Algorithm &algorithm);
|
||||||
|
|
||||||
inline bool isEmpty() const { return m_data.empty(); }
|
inline bool isEmpty() const { return m_data.empty(); }
|
||||||
inline const std::vector<OclThread> &data() const { return m_data; }
|
inline const std::vector<OclThread> &data() const { return m_data; }
|
||||||
@@ -47,6 +49,10 @@ public:
|
|||||||
inline void add(OclThread &&thread) { m_data.push_back(thread); }
|
inline void add(OclThread &&thread) { m_data.push_back(thread); }
|
||||||
inline void reserve(size_t capacity) { m_data.reserve(capacity); }
|
inline void reserve(size_t capacity) { m_data.reserve(capacity); }
|
||||||
|
|
||||||
|
inline bool operator!=(const OclThreads &other) const { return !isEqual(other); }
|
||||||
|
inline bool operator==(const OclThreads &other) const { return isEqual(other); }
|
||||||
|
|
||||||
|
bool isEqual(const OclThreads &other) const;
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
#include "backend/common/Tags.h"
|
#include "backend/common/Tags.h"
|
||||||
#include "backend/opencl/runners/OclCnRunner.h"
|
#include "backend/opencl/runners/OclCnRunner.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedData.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "core/Miner.h"
|
#include "core/Miner.h"
|
||||||
@@ -75,7 +77,7 @@ xmrig::OclWorker::OclWorker(size_t id, const OclLaunchData &data) :
|
|||||||
m_algorithm(data.algorithm),
|
m_algorithm(data.algorithm),
|
||||||
m_miner(data.miner),
|
m_miner(data.miner),
|
||||||
m_intensity(data.thread.intensity()),
|
m_intensity(data.thread.intensity()),
|
||||||
m_interleave(data.interleave)
|
m_sharedData(OclSharedState::get(data.device.index()))
|
||||||
{
|
{
|
||||||
switch (m_algorithm.family()) {
|
switch (m_algorithm.family()) {
|
||||||
case Algorithm::RANDOM_X:
|
case Algorithm::RANDOM_X:
|
||||||
@@ -149,9 +151,7 @@ void xmrig::OclWorker::start()
|
|||||||
|
|
||||||
while (Nonce::sequence(Nonce::OPENCL) > 0) {
|
while (Nonce::sequence(Nonce::OPENCL) > 0) {
|
||||||
if (!isReady()) {
|
if (!isReady()) {
|
||||||
if (m_interleave) {
|
m_sharedData.setResumeCounter(0);
|
||||||
m_interleave->setResumeCounter(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||||
@@ -162,9 +162,7 @@ void xmrig::OclWorker::start()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_interleave) {
|
m_sharedData.resumeDelay(m_id);
|
||||||
m_interleave->resumeDelay(m_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!consumeJob()) {
|
if (!consumeJob()) {
|
||||||
return;
|
return;
|
||||||
@@ -172,9 +170,7 @@ void xmrig::OclWorker::start()
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (!Nonce::isOutdated(Nonce::OPENCL, m_job.sequence())) {
|
while (!Nonce::isOutdated(Nonce::OPENCL, m_job.sequence())) {
|
||||||
if (m_interleave) {
|
m_sharedData.adjustDelay(m_id);
|
||||||
m_interleave->adjustDelay(m_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint64_t t = Chrono::steadyMSecs();
|
const uint64_t t = Chrono::steadyMSecs();
|
||||||
|
|
||||||
@@ -233,9 +229,7 @@ void xmrig::OclWorker::storeStats(uint64_t t)
|
|||||||
|
|
||||||
m_count += m_intensity;
|
m_count += m_intensity;
|
||||||
|
|
||||||
if (m_interleave) {
|
m_sharedData.setRunTime(Chrono::steadyMSecs() - t);
|
||||||
m_interleave->setRunTime(Chrono::steadyMSecs() - t);
|
|
||||||
}
|
|
||||||
|
|
||||||
Worker::storeStats();
|
Worker::storeStats();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ private:
|
|||||||
const Miner *m_miner;
|
const Miner *m_miner;
|
||||||
const uint32_t m_intensity;
|
const uint32_t m_intensity;
|
||||||
IOclRunner *m_runner = nullptr;
|
IOclRunner *m_runner = nullptr;
|
||||||
OclInterleavePtr m_interleave;
|
OclSharedData &m_sharedData;
|
||||||
WorkerJob<1> m_job;
|
WorkerJob<1> m_job;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,9 @@
|
|||||||
#define ALGO_RX_0 18
|
#define ALGO_RX_0 18
|
||||||
#define ALGO_RX_WOW 19
|
#define ALGO_RX_WOW 19
|
||||||
#define ALGO_RX_LOKI 20
|
#define ALGO_RX_LOKI 20
|
||||||
#define ALGO_AR2_CHUKWA 21
|
#define ALGO_RX_ARQMA 21
|
||||||
#define ALGO_AR2_WRKZ 22
|
#define ALGO_AR2_CHUKWA 22
|
||||||
|
#define ALGO_AR2_WRKZ 23
|
||||||
|
|
||||||
#define FAMILY_UNKNOWN 0
|
#define FAMILY_UNKNOWN 0
|
||||||
#define FAMILY_CN 1
|
#define FAMILY_CN 1
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,358 +2,379 @@
|
|||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static char cryptonight_r_defines_cl[7709] = {
|
static char cryptonight_r_defines_cl[8353] = {
|
||||||
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,
|
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,
|
||||||
0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,
|
0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,
|
||||||
0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x73,0x63,0x72,0x61,0x74,0x63,0x68,
|
0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x73,0x63,0x72,0x61,0x74,0x63,0x68,
|
||||||
0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x29,0x20,0x2b,0x20,0x28,0x69,0x64,0x78,0x31,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x29,0x29,0x0a,
|
0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x29,0x20,0x2b,0x20,0x28,0x69,0x64,0x78,0x31,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x29,0x29,0x0d,
|
||||||
0x23,0x65,0x6c,0x73,0x65,0x0a,0x23,0x69,0x66,0x20,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x30,0x29,0x0a,0x23,
|
0x23,0x65,0x6c,0x73,0x65,0x0d,0x23,0x69,0x66,0x20,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x30,0x29,0x0d,0x23,
|
||||||
0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,
|
0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,
|
||||||
0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,
|
0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,
|
||||||
0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x20,0x2b,0x20,0x28,0x69,0x64,0x78,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x29,
|
0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x20,0x2b,0x20,0x28,0x69,0x64,0x78,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x29,
|
||||||
0x29,0x0a,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x23,0x64,0x65,
|
0x29,0x0d,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0d,0x23,0x64,0x65,
|
||||||
0x66,0x69,0x6e,0x65,0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x67,0x6c,
|
0x66,0x69,0x6e,0x65,0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x67,0x6c,
|
||||||
0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,
|
0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,
|
||||||
0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x69,0x64,0x78,0x20,0x5e,
|
0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x69,0x64,0x78,0x20,0x5e,
|
||||||
0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x2c,0x20,0x54,0x68,0x72,0x65,0x61,0x64,0x73,0x29,0x29,0x29,0x0a,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x53,0x54,
|
0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x2c,0x20,0x54,0x68,0x72,0x65,0x61,0x64,0x73,0x29,0x29,0x29,0x0d,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x53,0x54,
|
||||||
0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x32,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x43,0x52,0x41,0x54,0x43,
|
0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x32,0x29,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x43,0x52,0x41,0x54,0x43,
|
||||||
0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,
|
0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,
|
||||||
0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x20,
|
0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x20,
|
||||||
0x2b,0x20,0x28,0x28,0x28,0x69,0x64,0x78,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x25,0x20,0x28,0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,
|
0x2b,0x20,0x28,0x28,0x28,0x69,0x64,0x78,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x25,0x20,0x28,0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,
|
||||||
0x4b,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x69,0x64,0x78,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x2f,0x20,0x28,
|
0x4b,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x69,0x64,0x78,0x20,0x5e,0x20,0x28,0x4e,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x2f,0x20,0x28,
|
||||||
0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x20,0x2a,0x20,0x28,0x4d,
|
0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x20,0x2a,0x20,0x28,0x4d,
|
||||||
0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x29,0x29,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,
|
0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x20,0x3c,0x3c,0x20,0x34,0x29,0x29,0x29,0x29,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,
|
||||||
0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x4f,0x54,0x5f,0x42,0x49,0x54,0x53,0x20,0x33,0x32,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x45,0x4d,0x5f,
|
0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x4f,0x54,0x5f,0x42,0x49,0x54,0x53,0x20,0x33,0x32,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x45,0x4d,0x5f,
|
||||||
0x43,0x48,0x55,0x4e,0x4b,0x20,0x28,0x31,0x20,0x3c,0x3c,0x20,0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x5f,0x45,0x58,0x50,0x4f,0x4e,0x45,0x4e,0x54,0x29,0x0a,
|
0x43,0x48,0x55,0x4e,0x4b,0x20,0x28,0x31,0x20,0x3c,0x3c,0x20,0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x5f,0x45,0x58,0x50,0x4f,0x4e,0x45,0x4e,0x54,0x29,0x0d,
|
||||||
0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x4f,0x4c,0x46,0x5f,0x41,0x45,0x53,0x5f,0x43,0x4c,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x57,0x4f,0x4c,0x46,
|
0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x4f,0x4c,0x46,0x5f,0x41,0x45,0x53,0x5f,0x43,0x4c,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x57,0x4f,0x4c,0x46,
|
||||||
0x5f,0x41,0x45,0x53,0x5f,0x43,0x4c,0x0a,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,0x6f,0x70,0x73,0x32,
|
0x5f,0x41,0x45,0x53,0x5f,0x43,0x4c,0x0d,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,0x6f,0x70,0x73,0x32,
|
||||||
0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,
|
0x0d,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,
|
||||||
0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,0x6f,0x70,0x73,0x32,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x78,0x6d,0x72,
|
0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,0x6f,0x70,0x73,0x32,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x78,0x6d,0x72,
|
||||||
0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x73,0x72,0x63,0x30,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x73,0x72,0x63,0x32,0x29,0x20,0x61,0x6d,0x64,
|
0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x73,0x72,0x63,0x30,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x73,0x72,0x63,0x32,0x29,0x20,0x61,0x6d,0x64,
|
||||||
0x5f,0x62,0x66,0x65,0x28,0x73,0x72,0x63,0x30,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x73,0x72,0x63,0x32,0x29,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x69,0x6e,0x6c,
|
0x5f,0x62,0x66,0x65,0x28,0x73,0x72,0x63,0x30,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x73,0x72,0x63,0x32,0x29,0x0d,0x23,0x65,0x6c,0x73,0x65,0x0d,0x69,0x6e,0x6c,
|
||||||
0x69,0x6e,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x6d,0x72,0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,
|
0x69,0x6e,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x6d,0x72,0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,
|
||||||
0x20,0x73,0x72,0x63,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,
|
0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,
|
||||||
0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x0a,0x7b,0x0a,0x69,0x66,0x28,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x69,0x64,0x74,0x68,0x29,0x3c,0x33,0x32,
|
0x75,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x0d,0x7b,0x0d,0x69,0x66,0x20,0x28,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,
|
||||||
0x75,0x29,0x20,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x73,0x72,0x63,0x30,0x3c,0x3c,0x28,0x33,0x32,0x75,0x2d,0x6f,0x66,0x66,0x73,0x65,0x74,0x2d,0x77,
|
0x68,0x29,0x20,0x3c,0x20,0x33,0x32,0x75,0x29,0x20,0x7b,0x0d,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x73,0x72,0x63,0x30,0x20,0x3c,0x3c,0x20,0x28,0x33,0x32,0x75,
|
||||||
0x69,0x64,0x74,0x68,0x29,0x29,0x3e,0x3e,0x28,0x33,0x32,0x75,0x2d,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0x0a,0x7d,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x73,0x72,
|
0x20,0x2d,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x29,0x20,0x3e,0x3e,0x20,0x28,0x33,0x32,0x75,0x20,0x2d,0x20,0x77,0x69,
|
||||||
0x63,0x30,0x3e,0x3e,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,
|
0x64,0x74,0x68,0x29,0x3b,0x0d,0x7d,0x0d,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x73,0x72,0x63,0x30,0x20,0x3e,0x3e,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0x0d,0x7d,
|
||||||
0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x41,0x45,0x53,0x30,0x5f,0x43,0x5b,0x32,0x35,0x36,0x5d,0x20,0x3d,0x0a,
|
0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,
|
||||||
0x7b,0x0a,0x30,0x78,0x41,0x35,0x36,0x33,0x36,0x33,0x43,0x36,0x55,0x2c,0x30,0x78,0x38,0x34,0x37,0x43,0x37,0x43,0x46,0x38,0x55,0x2c,0x30,0x78,0x39,0x39,0x37,0x37,
|
0x75,0x69,0x6e,0x74,0x20,0x41,0x45,0x53,0x30,0x5f,0x43,0x5b,0x32,0x35,0x36,0x5d,0x20,0x3d,0x0d,0x7b,0x0d,0x30,0x78,0x41,0x35,0x36,0x33,0x36,0x33,0x43,0x36,0x55,
|
||||||
0x37,0x37,0x45,0x45,0x55,0x2c,0x30,0x78,0x38,0x44,0x37,0x42,0x37,0x42,0x46,0x36,0x55,0x2c,0x0a,0x30,0x78,0x30,0x44,0x46,0x32,0x46,0x32,0x46,0x46,0x55,0x2c,0x30,
|
0x2c,0x20,0x30,0x78,0x38,0x34,0x37,0x43,0x37,0x43,0x46,0x38,0x55,0x2c,0x20,0x30,0x78,0x39,0x39,0x37,0x37,0x37,0x37,0x45,0x45,0x55,0x2c,0x20,0x30,0x78,0x38,0x44,
|
||||||
0x78,0x42,0x44,0x36,0x42,0x36,0x42,0x44,0x36,0x55,0x2c,0x30,0x78,0x42,0x31,0x36,0x46,0x36,0x46,0x44,0x45,0x55,0x2c,0x30,0x78,0x35,0x34,0x43,0x35,0x43,0x35,0x39,
|
0x37,0x42,0x37,0x42,0x46,0x36,0x55,0x2c,0x0d,0x30,0x78,0x30,0x44,0x46,0x32,0x46,0x32,0x46,0x46,0x55,0x2c,0x20,0x30,0x78,0x42,0x44,0x36,0x42,0x36,0x42,0x44,0x36,
|
||||||
0x31,0x55,0x2c,0x0a,0x30,0x78,0x35,0x30,0x33,0x30,0x33,0x30,0x36,0x30,0x55,0x2c,0x30,0x78,0x30,0x33,0x30,0x31,0x30,0x31,0x30,0x32,0x55,0x2c,0x30,0x78,0x41,0x39,
|
0x55,0x2c,0x20,0x30,0x78,0x42,0x31,0x36,0x46,0x36,0x46,0x44,0x45,0x55,0x2c,0x20,0x30,0x78,0x35,0x34,0x43,0x35,0x43,0x35,0x39,0x31,0x55,0x2c,0x0d,0x30,0x78,0x35,
|
||||||
0x36,0x37,0x36,0x37,0x43,0x45,0x55,0x2c,0x30,0x78,0x37,0x44,0x32,0x42,0x32,0x42,0x35,0x36,0x55,0x2c,0x0a,0x30,0x78,0x31,0x39,0x46,0x45,0x46,0x45,0x45,0x37,0x55,
|
0x30,0x33,0x30,0x33,0x30,0x36,0x30,0x55,0x2c,0x20,0x30,0x78,0x30,0x33,0x30,0x31,0x30,0x31,0x30,0x32,0x55,0x2c,0x20,0x30,0x78,0x41,0x39,0x36,0x37,0x36,0x37,0x43,
|
||||||
0x2c,0x30,0x78,0x36,0x32,0x44,0x37,0x44,0x37,0x42,0x35,0x55,0x2c,0x30,0x78,0x45,0x36,0x41,0x42,0x41,0x42,0x34,0x44,0x55,0x2c,0x30,0x78,0x39,0x41,0x37,0x36,0x37,
|
0x45,0x55,0x2c,0x20,0x30,0x78,0x37,0x44,0x32,0x42,0x32,0x42,0x35,0x36,0x55,0x2c,0x0d,0x30,0x78,0x31,0x39,0x46,0x45,0x46,0x45,0x45,0x37,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x36,0x45,0x43,0x55,0x2c,0x0a,0x30,0x78,0x34,0x35,0x43,0x41,0x43,0x41,0x38,0x46,0x55,0x2c,0x30,0x78,0x39,0x44,0x38,0x32,0x38,0x32,0x31,0x46,0x55,0x2c,0x30,0x78,
|
0x36,0x32,0x44,0x37,0x44,0x37,0x42,0x35,0x55,0x2c,0x20,0x30,0x78,0x45,0x36,0x41,0x42,0x41,0x42,0x34,0x44,0x55,0x2c,0x20,0x30,0x78,0x39,0x41,0x37,0x36,0x37,0x36,
|
||||||
0x34,0x30,0x43,0x39,0x43,0x39,0x38,0x39,0x55,0x2c,0x30,0x78,0x38,0x37,0x37,0x44,0x37,0x44,0x46,0x41,0x55,0x2c,0x0a,0x30,0x78,0x31,0x35,0x46,0x41,0x46,0x41,0x45,
|
0x45,0x43,0x55,0x2c,0x0d,0x30,0x78,0x34,0x35,0x43,0x41,0x43,0x41,0x38,0x46,0x55,0x2c,0x20,0x30,0x78,0x39,0x44,0x38,0x32,0x38,0x32,0x31,0x46,0x55,0x2c,0x20,0x30,
|
||||||
0x46,0x55,0x2c,0x30,0x78,0x45,0x42,0x35,0x39,0x35,0x39,0x42,0x32,0x55,0x2c,0x30,0x78,0x43,0x39,0x34,0x37,0x34,0x37,0x38,0x45,0x55,0x2c,0x30,0x78,0x30,0x42,0x46,
|
0x78,0x34,0x30,0x43,0x39,0x43,0x39,0x38,0x39,0x55,0x2c,0x20,0x30,0x78,0x38,0x37,0x37,0x44,0x37,0x44,0x46,0x41,0x55,0x2c,0x0d,0x30,0x78,0x31,0x35,0x46,0x41,0x46,
|
||||||
0x30,0x46,0x30,0x46,0x42,0x55,0x2c,0x0a,0x30,0x78,0x45,0x43,0x41,0x44,0x41,0x44,0x34,0x31,0x55,0x2c,0x30,0x78,0x36,0x37,0x44,0x34,0x44,0x34,0x42,0x33,0x55,0x2c,
|
0x41,0x45,0x46,0x55,0x2c,0x20,0x30,0x78,0x45,0x42,0x35,0x39,0x35,0x39,0x42,0x32,0x55,0x2c,0x20,0x30,0x78,0x43,0x39,0x34,0x37,0x34,0x37,0x38,0x45,0x55,0x2c,0x20,
|
||||||
0x30,0x78,0x46,0x44,0x41,0x32,0x41,0x32,0x35,0x46,0x55,0x2c,0x30,0x78,0x45,0x41,0x41,0x46,0x41,0x46,0x34,0x35,0x55,0x2c,0x0a,0x30,0x78,0x42,0x46,0x39,0x43,0x39,
|
0x30,0x78,0x30,0x42,0x46,0x30,0x46,0x30,0x46,0x42,0x55,0x2c,0x0d,0x30,0x78,0x45,0x43,0x41,0x44,0x41,0x44,0x34,0x31,0x55,0x2c,0x20,0x30,0x78,0x36,0x37,0x44,0x34,
|
||||||
0x43,0x32,0x33,0x55,0x2c,0x30,0x78,0x46,0x37,0x41,0x34,0x41,0x34,0x35,0x33,0x55,0x2c,0x30,0x78,0x39,0x36,0x37,0x32,0x37,0x32,0x45,0x34,0x55,0x2c,0x30,0x78,0x35,
|
0x44,0x34,0x42,0x33,0x55,0x2c,0x20,0x30,0x78,0x46,0x44,0x41,0x32,0x41,0x32,0x35,0x46,0x55,0x2c,0x20,0x30,0x78,0x45,0x41,0x41,0x46,0x41,0x46,0x34,0x35,0x55,0x2c,
|
||||||
0x42,0x43,0x30,0x43,0x30,0x39,0x42,0x55,0x2c,0x0a,0x30,0x78,0x43,0x32,0x42,0x37,0x42,0x37,0x37,0x35,0x55,0x2c,0x30,0x78,0x31,0x43,0x46,0x44,0x46,0x44,0x45,0x31,
|
0x0d,0x30,0x78,0x42,0x46,0x39,0x43,0x39,0x43,0x32,0x33,0x55,0x2c,0x20,0x30,0x78,0x46,0x37,0x41,0x34,0x41,0x34,0x35,0x33,0x55,0x2c,0x20,0x30,0x78,0x39,0x36,0x37,
|
||||||
0x55,0x2c,0x30,0x78,0x41,0x45,0x39,0x33,0x39,0x33,0x33,0x44,0x55,0x2c,0x30,0x78,0x36,0x41,0x32,0x36,0x32,0x36,0x34,0x43,0x55,0x2c,0x0a,0x30,0x78,0x35,0x41,0x33,
|
0x32,0x37,0x32,0x45,0x34,0x55,0x2c,0x20,0x30,0x78,0x35,0x42,0x43,0x30,0x43,0x30,0x39,0x42,0x55,0x2c,0x0d,0x30,0x78,0x43,0x32,0x42,0x37,0x42,0x37,0x37,0x35,0x55,
|
||||||
0x36,0x33,0x36,0x36,0x43,0x55,0x2c,0x30,0x78,0x34,0x31,0x33,0x46,0x33,0x46,0x37,0x45,0x55,0x2c,0x30,0x78,0x30,0x32,0x46,0x37,0x46,0x37,0x46,0x35,0x55,0x2c,0x30,
|
0x2c,0x20,0x30,0x78,0x31,0x43,0x46,0x44,0x46,0x44,0x45,0x31,0x55,0x2c,0x20,0x30,0x78,0x41,0x45,0x39,0x33,0x39,0x33,0x33,0x44,0x55,0x2c,0x20,0x30,0x78,0x36,0x41,
|
||||||
0x78,0x34,0x46,0x43,0x43,0x43,0x43,0x38,0x33,0x55,0x2c,0x0a,0x30,0x78,0x35,0x43,0x33,0x34,0x33,0x34,0x36,0x38,0x55,0x2c,0x30,0x78,0x46,0x34,0x41,0x35,0x41,0x35,
|
0x32,0x36,0x32,0x36,0x34,0x43,0x55,0x2c,0x0d,0x30,0x78,0x35,0x41,0x33,0x36,0x33,0x36,0x36,0x43,0x55,0x2c,0x20,0x30,0x78,0x34,0x31,0x33,0x46,0x33,0x46,0x37,0x45,
|
||||||
0x35,0x31,0x55,0x2c,0x30,0x78,0x33,0x34,0x45,0x35,0x45,0x35,0x44,0x31,0x55,0x2c,0x30,0x78,0x30,0x38,0x46,0x31,0x46,0x31,0x46,0x39,0x55,0x2c,0x0a,0x30,0x78,0x39,
|
0x55,0x2c,0x20,0x30,0x78,0x30,0x32,0x46,0x37,0x46,0x37,0x46,0x35,0x55,0x2c,0x20,0x30,0x78,0x34,0x46,0x43,0x43,0x43,0x43,0x38,0x33,0x55,0x2c,0x0d,0x30,0x78,0x35,
|
||||||
0x33,0x37,0x31,0x37,0x31,0x45,0x32,0x55,0x2c,0x30,0x78,0x37,0x33,0x44,0x38,0x44,0x38,0x41,0x42,0x55,0x2c,0x30,0x78,0x35,0x33,0x33,0x31,0x33,0x31,0x36,0x32,0x55,
|
0x43,0x33,0x34,0x33,0x34,0x36,0x38,0x55,0x2c,0x20,0x30,0x78,0x46,0x34,0x41,0x35,0x41,0x35,0x35,0x31,0x55,0x2c,0x20,0x30,0x78,0x33,0x34,0x45,0x35,0x45,0x35,0x44,
|
||||||
0x2c,0x30,0x78,0x33,0x46,0x31,0x35,0x31,0x35,0x32,0x41,0x55,0x2c,0x0a,0x30,0x78,0x30,0x43,0x30,0x34,0x30,0x34,0x30,0x38,0x55,0x2c,0x30,0x78,0x35,0x32,0x43,0x37,
|
0x31,0x55,0x2c,0x20,0x30,0x78,0x30,0x38,0x46,0x31,0x46,0x31,0x46,0x39,0x55,0x2c,0x0d,0x30,0x78,0x39,0x33,0x37,0x31,0x37,0x31,0x45,0x32,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x43,0x37,0x39,0x35,0x55,0x2c,0x30,0x78,0x36,0x35,0x32,0x33,0x32,0x33,0x34,0x36,0x55,0x2c,0x30,0x78,0x35,0x45,0x43,0x33,0x43,0x33,0x39,0x44,0x55,0x2c,0x0a,0x30,
|
0x37,0x33,0x44,0x38,0x44,0x38,0x41,0x42,0x55,0x2c,0x20,0x30,0x78,0x35,0x33,0x33,0x31,0x33,0x31,0x36,0x32,0x55,0x2c,0x20,0x30,0x78,0x33,0x46,0x31,0x35,0x31,0x35,
|
||||||
0x78,0x32,0x38,0x31,0x38,0x31,0x38,0x33,0x30,0x55,0x2c,0x30,0x78,0x41,0x31,0x39,0x36,0x39,0x36,0x33,0x37,0x55,0x2c,0x30,0x78,0x30,0x46,0x30,0x35,0x30,0x35,0x30,
|
0x32,0x41,0x55,0x2c,0x0d,0x30,0x78,0x30,0x43,0x30,0x34,0x30,0x34,0x30,0x38,0x55,0x2c,0x20,0x30,0x78,0x35,0x32,0x43,0x37,0x43,0x37,0x39,0x35,0x55,0x2c,0x20,0x30,
|
||||||
0x41,0x55,0x2c,0x30,0x78,0x42,0x35,0x39,0x41,0x39,0x41,0x32,0x46,0x55,0x2c,0x0a,0x30,0x78,0x30,0x39,0x30,0x37,0x30,0x37,0x30,0x45,0x55,0x2c,0x30,0x78,0x33,0x36,
|
0x78,0x36,0x35,0x32,0x33,0x32,0x33,0x34,0x36,0x55,0x2c,0x20,0x30,0x78,0x35,0x45,0x43,0x33,0x43,0x33,0x39,0x44,0x55,0x2c,0x0d,0x30,0x78,0x32,0x38,0x31,0x38,0x31,
|
||||||
0x31,0x32,0x31,0x32,0x32,0x34,0x55,0x2c,0x30,0x78,0x39,0x42,0x38,0x30,0x38,0x30,0x31,0x42,0x55,0x2c,0x30,0x78,0x33,0x44,0x45,0x32,0x45,0x32,0x44,0x46,0x55,0x2c,
|
0x38,0x33,0x30,0x55,0x2c,0x20,0x30,0x78,0x41,0x31,0x39,0x36,0x39,0x36,0x33,0x37,0x55,0x2c,0x20,0x30,0x78,0x30,0x46,0x30,0x35,0x30,0x35,0x30,0x41,0x55,0x2c,0x20,
|
||||||
0x0a,0x30,0x78,0x32,0x36,0x45,0x42,0x45,0x42,0x43,0x44,0x55,0x2c,0x30,0x78,0x36,0x39,0x32,0x37,0x32,0x37,0x34,0x45,0x55,0x2c,0x30,0x78,0x43,0x44,0x42,0x32,0x42,
|
0x30,0x78,0x42,0x35,0x39,0x41,0x39,0x41,0x32,0x46,0x55,0x2c,0x0d,0x30,0x78,0x30,0x39,0x30,0x37,0x30,0x37,0x30,0x45,0x55,0x2c,0x20,0x30,0x78,0x33,0x36,0x31,0x32,
|
||||||
0x32,0x37,0x46,0x55,0x2c,0x30,0x78,0x39,0x46,0x37,0x35,0x37,0x35,0x45,0x41,0x55,0x2c,0x0a,0x30,0x78,0x31,0x42,0x30,0x39,0x30,0x39,0x31,0x32,0x55,0x2c,0x30,0x78,
|
0x31,0x32,0x32,0x34,0x55,0x2c,0x20,0x30,0x78,0x39,0x42,0x38,0x30,0x38,0x30,0x31,0x42,0x55,0x2c,0x20,0x30,0x78,0x33,0x44,0x45,0x32,0x45,0x32,0x44,0x46,0x55,0x2c,
|
||||||
0x39,0x45,0x38,0x33,0x38,0x33,0x31,0x44,0x55,0x2c,0x30,0x78,0x37,0x34,0x32,0x43,0x32,0x43,0x35,0x38,0x55,0x2c,0x30,0x78,0x32,0x45,0x31,0x41,0x31,0x41,0x33,0x34,
|
0x0d,0x30,0x78,0x32,0x36,0x45,0x42,0x45,0x42,0x43,0x44,0x55,0x2c,0x20,0x30,0x78,0x36,0x39,0x32,0x37,0x32,0x37,0x34,0x45,0x55,0x2c,0x20,0x30,0x78,0x43,0x44,0x42,
|
||||||
0x55,0x2c,0x0a,0x30,0x78,0x32,0x44,0x31,0x42,0x31,0x42,0x33,0x36,0x55,0x2c,0x30,0x78,0x42,0x32,0x36,0x45,0x36,0x45,0x44,0x43,0x55,0x2c,0x30,0x78,0x45,0x45,0x35,
|
0x32,0x42,0x32,0x37,0x46,0x55,0x2c,0x20,0x30,0x78,0x39,0x46,0x37,0x35,0x37,0x35,0x45,0x41,0x55,0x2c,0x0d,0x30,0x78,0x31,0x42,0x30,0x39,0x30,0x39,0x31,0x32,0x55,
|
||||||
0x41,0x35,0x41,0x42,0x34,0x55,0x2c,0x30,0x78,0x46,0x42,0x41,0x30,0x41,0x30,0x35,0x42,0x55,0x2c,0x0a,0x30,0x78,0x46,0x36,0x35,0x32,0x35,0x32,0x41,0x34,0x55,0x2c,
|
0x2c,0x20,0x30,0x78,0x39,0x45,0x38,0x33,0x38,0x33,0x31,0x44,0x55,0x2c,0x20,0x30,0x78,0x37,0x34,0x32,0x43,0x32,0x43,0x35,0x38,0x55,0x2c,0x20,0x30,0x78,0x32,0x45,
|
||||||
0x30,0x78,0x34,0x44,0x33,0x42,0x33,0x42,0x37,0x36,0x55,0x2c,0x30,0x78,0x36,0x31,0x44,0x36,0x44,0x36,0x42,0x37,0x55,0x2c,0x30,0x78,0x43,0x45,0x42,0x33,0x42,0x33,
|
0x31,0x41,0x31,0x41,0x33,0x34,0x55,0x2c,0x0d,0x30,0x78,0x32,0x44,0x31,0x42,0x31,0x42,0x33,0x36,0x55,0x2c,0x20,0x30,0x78,0x42,0x32,0x36,0x45,0x36,0x45,0x44,0x43,
|
||||||
0x37,0x44,0x55,0x2c,0x0a,0x30,0x78,0x37,0x42,0x32,0x39,0x32,0x39,0x35,0x32,0x55,0x2c,0x30,0x78,0x33,0x45,0x45,0x33,0x45,0x33,0x44,0x44,0x55,0x2c,0x30,0x78,0x37,
|
0x55,0x2c,0x20,0x30,0x78,0x45,0x45,0x35,0x41,0x35,0x41,0x42,0x34,0x55,0x2c,0x20,0x30,0x78,0x46,0x42,0x41,0x30,0x41,0x30,0x35,0x42,0x55,0x2c,0x0d,0x30,0x78,0x46,
|
||||||
0x31,0x32,0x46,0x32,0x46,0x35,0x45,0x55,0x2c,0x30,0x78,0x39,0x37,0x38,0x34,0x38,0x34,0x31,0x33,0x55,0x2c,0x0a,0x30,0x78,0x46,0x35,0x35,0x33,0x35,0x33,0x41,0x36,
|
0x36,0x35,0x32,0x35,0x32,0x41,0x34,0x55,0x2c,0x20,0x30,0x78,0x34,0x44,0x33,0x42,0x33,0x42,0x37,0x36,0x55,0x2c,0x20,0x30,0x78,0x36,0x31,0x44,0x36,0x44,0x36,0x42,
|
||||||
0x55,0x2c,0x30,0x78,0x36,0x38,0x44,0x31,0x44,0x31,0x42,0x39,0x55,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x55,0x2c,0x30,0x78,0x32,0x43,0x45,0x44,
|
0x37,0x55,0x2c,0x20,0x30,0x78,0x43,0x45,0x42,0x33,0x42,0x33,0x37,0x44,0x55,0x2c,0x0d,0x30,0x78,0x37,0x42,0x32,0x39,0x32,0x39,0x35,0x32,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x45,0x44,0x43,0x31,0x55,0x2c,0x0a,0x30,0x78,0x36,0x30,0x32,0x30,0x32,0x30,0x34,0x30,0x55,0x2c,0x30,0x78,0x31,0x46,0x46,0x43,0x46,0x43,0x45,0x33,0x55,0x2c,0x30,
|
0x33,0x45,0x45,0x33,0x45,0x33,0x44,0x44,0x55,0x2c,0x20,0x30,0x78,0x37,0x31,0x32,0x46,0x32,0x46,0x35,0x45,0x55,0x2c,0x20,0x30,0x78,0x39,0x37,0x38,0x34,0x38,0x34,
|
||||||
0x78,0x43,0x38,0x42,0x31,0x42,0x31,0x37,0x39,0x55,0x2c,0x30,0x78,0x45,0x44,0x35,0x42,0x35,0x42,0x42,0x36,0x55,0x2c,0x0a,0x30,0x78,0x42,0x45,0x36,0x41,0x36,0x41,
|
0x31,0x33,0x55,0x2c,0x0d,0x30,0x78,0x46,0x35,0x35,0x33,0x35,0x33,0x41,0x36,0x55,0x2c,0x20,0x30,0x78,0x36,0x38,0x44,0x31,0x44,0x31,0x42,0x39,0x55,0x2c,0x20,0x30,
|
||||||
0x44,0x34,0x55,0x2c,0x30,0x78,0x34,0x36,0x43,0x42,0x43,0x42,0x38,0x44,0x55,0x2c,0x30,0x78,0x44,0x39,0x42,0x45,0x42,0x45,0x36,0x37,0x55,0x2c,0x30,0x78,0x34,0x42,
|
0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x55,0x2c,0x20,0x30,0x78,0x32,0x43,0x45,0x44,0x45,0x44,0x43,0x31,0x55,0x2c,0x0d,0x30,0x78,0x36,0x30,0x32,0x30,0x32,
|
||||||
0x33,0x39,0x33,0x39,0x37,0x32,0x55,0x2c,0x0a,0x30,0x78,0x44,0x45,0x34,0x41,0x34,0x41,0x39,0x34,0x55,0x2c,0x30,0x78,0x44,0x34,0x34,0x43,0x34,0x43,0x39,0x38,0x55,
|
0x30,0x34,0x30,0x55,0x2c,0x20,0x30,0x78,0x31,0x46,0x46,0x43,0x46,0x43,0x45,0x33,0x55,0x2c,0x20,0x30,0x78,0x43,0x38,0x42,0x31,0x42,0x31,0x37,0x39,0x55,0x2c,0x20,
|
||||||
0x2c,0x30,0x78,0x45,0x38,0x35,0x38,0x35,0x38,0x42,0x30,0x55,0x2c,0x30,0x78,0x34,0x41,0x43,0x46,0x43,0x46,0x38,0x35,0x55,0x2c,0x0a,0x30,0x78,0x36,0x42,0x44,0x30,
|
0x30,0x78,0x45,0x44,0x35,0x42,0x35,0x42,0x42,0x36,0x55,0x2c,0x0d,0x30,0x78,0x42,0x45,0x36,0x41,0x36,0x41,0x44,0x34,0x55,0x2c,0x20,0x30,0x78,0x34,0x36,0x43,0x42,
|
||||||
0x44,0x30,0x42,0x42,0x55,0x2c,0x30,0x78,0x32,0x41,0x45,0x46,0x45,0x46,0x43,0x35,0x55,0x2c,0x30,0x78,0x45,0x35,0x41,0x41,0x41,0x41,0x34,0x46,0x55,0x2c,0x30,0x78,
|
0x43,0x42,0x38,0x44,0x55,0x2c,0x20,0x30,0x78,0x44,0x39,0x42,0x45,0x42,0x45,0x36,0x37,0x55,0x2c,0x20,0x30,0x78,0x34,0x42,0x33,0x39,0x33,0x39,0x37,0x32,0x55,0x2c,
|
||||||
0x31,0x36,0x46,0x42,0x46,0x42,0x45,0x44,0x55,0x2c,0x0a,0x30,0x78,0x43,0x35,0x34,0x33,0x34,0x33,0x38,0x36,0x55,0x2c,0x30,0x78,0x44,0x37,0x34,0x44,0x34,0x44,0x39,
|
0x0d,0x30,0x78,0x44,0x45,0x34,0x41,0x34,0x41,0x39,0x34,0x55,0x2c,0x20,0x30,0x78,0x44,0x34,0x34,0x43,0x34,0x43,0x39,0x38,0x55,0x2c,0x20,0x30,0x78,0x45,0x38,0x35,
|
||||||
0x41,0x55,0x2c,0x30,0x78,0x35,0x35,0x33,0x33,0x33,0x33,0x36,0x36,0x55,0x2c,0x30,0x78,0x39,0x34,0x38,0x35,0x38,0x35,0x31,0x31,0x55,0x2c,0x0a,0x30,0x78,0x43,0x46,
|
0x38,0x35,0x38,0x42,0x30,0x55,0x2c,0x20,0x30,0x78,0x34,0x41,0x43,0x46,0x43,0x46,0x38,0x35,0x55,0x2c,0x0d,0x30,0x78,0x36,0x42,0x44,0x30,0x44,0x30,0x42,0x42,0x55,
|
||||||
0x34,0x35,0x34,0x35,0x38,0x41,0x55,0x2c,0x30,0x78,0x31,0x30,0x46,0x39,0x46,0x39,0x45,0x39,0x55,0x2c,0x30,0x78,0x30,0x36,0x30,0x32,0x30,0x32,0x30,0x34,0x55,0x2c,
|
0x2c,0x20,0x30,0x78,0x32,0x41,0x45,0x46,0x45,0x46,0x43,0x35,0x55,0x2c,0x20,0x30,0x78,0x45,0x35,0x41,0x41,0x41,0x41,0x34,0x46,0x55,0x2c,0x20,0x30,0x78,0x31,0x36,
|
||||||
0x30,0x78,0x38,0x31,0x37,0x46,0x37,0x46,0x46,0x45,0x55,0x2c,0x0a,0x30,0x78,0x46,0x30,0x35,0x30,0x35,0x30,0x41,0x30,0x55,0x2c,0x30,0x78,0x34,0x34,0x33,0x43,0x33,
|
0x46,0x42,0x46,0x42,0x45,0x44,0x55,0x2c,0x0d,0x30,0x78,0x43,0x35,0x34,0x33,0x34,0x33,0x38,0x36,0x55,0x2c,0x20,0x30,0x78,0x44,0x37,0x34,0x44,0x34,0x44,0x39,0x41,
|
||||||
0x43,0x37,0x38,0x55,0x2c,0x30,0x78,0x42,0x41,0x39,0x46,0x39,0x46,0x32,0x35,0x55,0x2c,0x30,0x78,0x45,0x33,0x41,0x38,0x41,0x38,0x34,0x42,0x55,0x2c,0x0a,0x30,0x78,
|
0x55,0x2c,0x20,0x30,0x78,0x35,0x35,0x33,0x33,0x33,0x33,0x36,0x36,0x55,0x2c,0x20,0x30,0x78,0x39,0x34,0x38,0x35,0x38,0x35,0x31,0x31,0x55,0x2c,0x0d,0x30,0x78,0x43,
|
||||||
0x46,0x33,0x35,0x31,0x35,0x31,0x41,0x32,0x55,0x2c,0x30,0x78,0x46,0x45,0x41,0x33,0x41,0x33,0x35,0x44,0x55,0x2c,0x30,0x78,0x43,0x30,0x34,0x30,0x34,0x30,0x38,0x30,
|
0x46,0x34,0x35,0x34,0x35,0x38,0x41,0x55,0x2c,0x20,0x30,0x78,0x31,0x30,0x46,0x39,0x46,0x39,0x45,0x39,0x55,0x2c,0x20,0x30,0x78,0x30,0x36,0x30,0x32,0x30,0x32,0x30,
|
||||||
0x55,0x2c,0x30,0x78,0x38,0x41,0x38,0x46,0x38,0x46,0x30,0x35,0x55,0x2c,0x0a,0x30,0x78,0x41,0x44,0x39,0x32,0x39,0x32,0x33,0x46,0x55,0x2c,0x30,0x78,0x42,0x43,0x39,
|
0x34,0x55,0x2c,0x20,0x30,0x78,0x38,0x31,0x37,0x46,0x37,0x46,0x46,0x45,0x55,0x2c,0x0d,0x30,0x78,0x46,0x30,0x35,0x30,0x35,0x30,0x41,0x30,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x44,0x39,0x44,0x32,0x31,0x55,0x2c,0x30,0x78,0x34,0x38,0x33,0x38,0x33,0x38,0x37,0x30,0x55,0x2c,0x30,0x78,0x30,0x34,0x46,0x35,0x46,0x35,0x46,0x31,0x55,0x2c,0x0a,
|
0x34,0x34,0x33,0x43,0x33,0x43,0x37,0x38,0x55,0x2c,0x20,0x30,0x78,0x42,0x41,0x39,0x46,0x39,0x46,0x32,0x35,0x55,0x2c,0x20,0x30,0x78,0x45,0x33,0x41,0x38,0x41,0x38,
|
||||||
0x30,0x78,0x44,0x46,0x42,0x43,0x42,0x43,0x36,0x33,0x55,0x2c,0x30,0x78,0x43,0x31,0x42,0x36,0x42,0x36,0x37,0x37,0x55,0x2c,0x30,0x78,0x37,0x35,0x44,0x41,0x44,0x41,
|
0x34,0x42,0x55,0x2c,0x0d,0x30,0x78,0x46,0x33,0x35,0x31,0x35,0x31,0x41,0x32,0x55,0x2c,0x20,0x30,0x78,0x46,0x45,0x41,0x33,0x41,0x33,0x35,0x44,0x55,0x2c,0x20,0x30,
|
||||||
0x41,0x46,0x55,0x2c,0x30,0x78,0x36,0x33,0x32,0x31,0x32,0x31,0x34,0x32,0x55,0x2c,0x0a,0x30,0x78,0x33,0x30,0x31,0x30,0x31,0x30,0x32,0x30,0x55,0x2c,0x30,0x78,0x31,
|
0x78,0x43,0x30,0x34,0x30,0x34,0x30,0x38,0x30,0x55,0x2c,0x20,0x30,0x78,0x38,0x41,0x38,0x46,0x38,0x46,0x30,0x35,0x55,0x2c,0x0d,0x30,0x78,0x41,0x44,0x39,0x32,0x39,
|
||||||
0x41,0x46,0x46,0x46,0x46,0x45,0x35,0x55,0x2c,0x30,0x78,0x30,0x45,0x46,0x33,0x46,0x33,0x46,0x44,0x55,0x2c,0x30,0x78,0x36,0x44,0x44,0x32,0x44,0x32,0x42,0x46,0x55,
|
0x32,0x33,0x46,0x55,0x2c,0x20,0x30,0x78,0x42,0x43,0x39,0x44,0x39,0x44,0x32,0x31,0x55,0x2c,0x20,0x30,0x78,0x34,0x38,0x33,0x38,0x33,0x38,0x37,0x30,0x55,0x2c,0x20,
|
||||||
0x2c,0x0a,0x30,0x78,0x34,0x43,0x43,0x44,0x43,0x44,0x38,0x31,0x55,0x2c,0x30,0x78,0x31,0x34,0x30,0x43,0x30,0x43,0x31,0x38,0x55,0x2c,0x30,0x78,0x33,0x35,0x31,0x33,
|
0x30,0x78,0x30,0x34,0x46,0x35,0x46,0x35,0x46,0x31,0x55,0x2c,0x0d,0x30,0x78,0x44,0x46,0x42,0x43,0x42,0x43,0x36,0x33,0x55,0x2c,0x20,0x30,0x78,0x43,0x31,0x42,0x36,
|
||||||
0x31,0x33,0x32,0x36,0x55,0x2c,0x30,0x78,0x32,0x46,0x45,0x43,0x45,0x43,0x43,0x33,0x55,0x2c,0x0a,0x30,0x78,0x45,0x31,0x35,0x46,0x35,0x46,0x42,0x45,0x55,0x2c,0x30,
|
0x42,0x36,0x37,0x37,0x55,0x2c,0x20,0x30,0x78,0x37,0x35,0x44,0x41,0x44,0x41,0x41,0x46,0x55,0x2c,0x20,0x30,0x78,0x36,0x33,0x32,0x31,0x32,0x31,0x34,0x32,0x55,0x2c,
|
||||||
0x78,0x41,0x32,0x39,0x37,0x39,0x37,0x33,0x35,0x55,0x2c,0x30,0x78,0x43,0x43,0x34,0x34,0x34,0x34,0x38,0x38,0x55,0x2c,0x30,0x78,0x33,0x39,0x31,0x37,0x31,0x37,0x32,
|
0x0d,0x30,0x78,0x33,0x30,0x31,0x30,0x31,0x30,0x32,0x30,0x55,0x2c,0x20,0x30,0x78,0x31,0x41,0x46,0x46,0x46,0x46,0x45,0x35,0x55,0x2c,0x20,0x30,0x78,0x30,0x45,0x46,
|
||||||
0x45,0x55,0x2c,0x0a,0x30,0x78,0x35,0x37,0x43,0x34,0x43,0x34,0x39,0x33,0x55,0x2c,0x30,0x78,0x46,0x32,0x41,0x37,0x41,0x37,0x35,0x35,0x55,0x2c,0x30,0x78,0x38,0x32,
|
0x33,0x46,0x33,0x46,0x44,0x55,0x2c,0x20,0x30,0x78,0x36,0x44,0x44,0x32,0x44,0x32,0x42,0x46,0x55,0x2c,0x0d,0x30,0x78,0x34,0x43,0x43,0x44,0x43,0x44,0x38,0x31,0x55,
|
||||||
0x37,0x45,0x37,0x45,0x46,0x43,0x55,0x2c,0x30,0x78,0x34,0x37,0x33,0x44,0x33,0x44,0x37,0x41,0x55,0x2c,0x0a,0x30,0x78,0x41,0x43,0x36,0x34,0x36,0x34,0x43,0x38,0x55,
|
0x2c,0x20,0x30,0x78,0x31,0x34,0x30,0x43,0x30,0x43,0x31,0x38,0x55,0x2c,0x20,0x30,0x78,0x33,0x35,0x31,0x33,0x31,0x33,0x32,0x36,0x55,0x2c,0x20,0x30,0x78,0x32,0x46,
|
||||||
0x2c,0x30,0x78,0x45,0x37,0x35,0x44,0x35,0x44,0x42,0x41,0x55,0x2c,0x30,0x78,0x32,0x42,0x31,0x39,0x31,0x39,0x33,0x32,0x55,0x2c,0x30,0x78,0x39,0x35,0x37,0x33,0x37,
|
0x45,0x43,0x45,0x43,0x43,0x33,0x55,0x2c,0x0d,0x30,0x78,0x45,0x31,0x35,0x46,0x35,0x46,0x42,0x45,0x55,0x2c,0x20,0x30,0x78,0x41,0x32,0x39,0x37,0x39,0x37,0x33,0x35,
|
||||||
0x33,0x45,0x36,0x55,0x2c,0x0a,0x30,0x78,0x41,0x30,0x36,0x30,0x36,0x30,0x43,0x30,0x55,0x2c,0x30,0x78,0x39,0x38,0x38,0x31,0x38,0x31,0x31,0x39,0x55,0x2c,0x30,0x78,
|
0x55,0x2c,0x20,0x30,0x78,0x43,0x43,0x34,0x34,0x34,0x34,0x38,0x38,0x55,0x2c,0x20,0x30,0x78,0x33,0x39,0x31,0x37,0x31,0x37,0x32,0x45,0x55,0x2c,0x0d,0x30,0x78,0x35,
|
||||||
0x44,0x31,0x34,0x46,0x34,0x46,0x39,0x45,0x55,0x2c,0x30,0x78,0x37,0x46,0x44,0x43,0x44,0x43,0x41,0x33,0x55,0x2c,0x0a,0x30,0x78,0x36,0x36,0x32,0x32,0x32,0x32,0x34,
|
0x37,0x43,0x34,0x43,0x34,0x39,0x33,0x55,0x2c,0x20,0x30,0x78,0x46,0x32,0x41,0x37,0x41,0x37,0x35,0x35,0x55,0x2c,0x20,0x30,0x78,0x38,0x32,0x37,0x45,0x37,0x45,0x46,
|
||||||
0x34,0x55,0x2c,0x30,0x78,0x37,0x45,0x32,0x41,0x32,0x41,0x35,0x34,0x55,0x2c,0x30,0x78,0x41,0x42,0x39,0x30,0x39,0x30,0x33,0x42,0x55,0x2c,0x30,0x78,0x38,0x33,0x38,
|
0x43,0x55,0x2c,0x20,0x30,0x78,0x34,0x37,0x33,0x44,0x33,0x44,0x37,0x41,0x55,0x2c,0x0d,0x30,0x78,0x41,0x43,0x36,0x34,0x36,0x34,0x43,0x38,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x38,0x38,0x38,0x30,0x42,0x55,0x2c,0x0a,0x30,0x78,0x43,0x41,0x34,0x36,0x34,0x36,0x38,0x43,0x55,0x2c,0x30,0x78,0x32,0x39,0x45,0x45,0x45,0x45,0x43,0x37,0x55,0x2c,
|
0x45,0x37,0x35,0x44,0x35,0x44,0x42,0x41,0x55,0x2c,0x20,0x30,0x78,0x32,0x42,0x31,0x39,0x31,0x39,0x33,0x32,0x55,0x2c,0x20,0x30,0x78,0x39,0x35,0x37,0x33,0x37,0x33,
|
||||||
0x30,0x78,0x44,0x33,0x42,0x38,0x42,0x38,0x36,0x42,0x55,0x2c,0x30,0x78,0x33,0x43,0x31,0x34,0x31,0x34,0x32,0x38,0x55,0x2c,0x0a,0x30,0x78,0x37,0x39,0x44,0x45,0x44,
|
0x45,0x36,0x55,0x2c,0x0d,0x30,0x78,0x41,0x30,0x36,0x30,0x36,0x30,0x43,0x30,0x55,0x2c,0x20,0x30,0x78,0x39,0x38,0x38,0x31,0x38,0x31,0x31,0x39,0x55,0x2c,0x20,0x30,
|
||||||
0x45,0x41,0x37,0x55,0x2c,0x30,0x78,0x45,0x32,0x35,0x45,0x35,0x45,0x42,0x43,0x55,0x2c,0x30,0x78,0x31,0x44,0x30,0x42,0x30,0x42,0x31,0x36,0x55,0x2c,0x30,0x78,0x37,
|
0x78,0x44,0x31,0x34,0x46,0x34,0x46,0x39,0x45,0x55,0x2c,0x20,0x30,0x78,0x37,0x46,0x44,0x43,0x44,0x43,0x41,0x33,0x55,0x2c,0x0d,0x30,0x78,0x36,0x36,0x32,0x32,0x32,
|
||||||
0x36,0x44,0x42,0x44,0x42,0x41,0x44,0x55,0x2c,0x0a,0x30,0x78,0x33,0x42,0x45,0x30,0x45,0x30,0x44,0x42,0x55,0x2c,0x30,0x78,0x35,0x36,0x33,0x32,0x33,0x32,0x36,0x34,
|
0x32,0x34,0x34,0x55,0x2c,0x20,0x30,0x78,0x37,0x45,0x32,0x41,0x32,0x41,0x35,0x34,0x55,0x2c,0x20,0x30,0x78,0x41,0x42,0x39,0x30,0x39,0x30,0x33,0x42,0x55,0x2c,0x20,
|
||||||
0x55,0x2c,0x30,0x78,0x34,0x45,0x33,0x41,0x33,0x41,0x37,0x34,0x55,0x2c,0x30,0x78,0x31,0x45,0x30,0x41,0x30,0x41,0x31,0x34,0x55,0x2c,0x0a,0x30,0x78,0x44,0x42,0x34,
|
0x30,0x78,0x38,0x33,0x38,0x38,0x38,0x38,0x30,0x42,0x55,0x2c,0x0d,0x30,0x78,0x43,0x41,0x34,0x36,0x34,0x36,0x38,0x43,0x55,0x2c,0x20,0x30,0x78,0x32,0x39,0x45,0x45,
|
||||||
0x39,0x34,0x39,0x39,0x32,0x55,0x2c,0x30,0x78,0x30,0x41,0x30,0x36,0x30,0x36,0x30,0x43,0x55,0x2c,0x30,0x78,0x36,0x43,0x32,0x34,0x32,0x34,0x34,0x38,0x55,0x2c,0x30,
|
0x45,0x45,0x43,0x37,0x55,0x2c,0x20,0x30,0x78,0x44,0x33,0x42,0x38,0x42,0x38,0x36,0x42,0x55,0x2c,0x20,0x30,0x78,0x33,0x43,0x31,0x34,0x31,0x34,0x32,0x38,0x55,0x2c,
|
||||||
0x78,0x45,0x34,0x35,0x43,0x35,0x43,0x42,0x38,0x55,0x2c,0x0a,0x30,0x78,0x35,0x44,0x43,0x32,0x43,0x32,0x39,0x46,0x55,0x2c,0x30,0x78,0x36,0x45,0x44,0x33,0x44,0x33,
|
0x0d,0x30,0x78,0x37,0x39,0x44,0x45,0x44,0x45,0x41,0x37,0x55,0x2c,0x20,0x30,0x78,0x45,0x32,0x35,0x45,0x35,0x45,0x42,0x43,0x55,0x2c,0x20,0x30,0x78,0x31,0x44,0x30,
|
||||||
0x42,0x44,0x55,0x2c,0x30,0x78,0x45,0x46,0x41,0x43,0x41,0x43,0x34,0x33,0x55,0x2c,0x30,0x78,0x41,0x36,0x36,0x32,0x36,0x32,0x43,0x34,0x55,0x2c,0x0a,0x30,0x78,0x41,
|
0x42,0x30,0x42,0x31,0x36,0x55,0x2c,0x20,0x30,0x78,0x37,0x36,0x44,0x42,0x44,0x42,0x41,0x44,0x55,0x2c,0x0d,0x30,0x78,0x33,0x42,0x45,0x30,0x45,0x30,0x44,0x42,0x55,
|
||||||
0x38,0x39,0x31,0x39,0x31,0x33,0x39,0x55,0x2c,0x30,0x78,0x41,0x34,0x39,0x35,0x39,0x35,0x33,0x31,0x55,0x2c,0x30,0x78,0x33,0x37,0x45,0x34,0x45,0x34,0x44,0x33,0x55,
|
0x2c,0x20,0x30,0x78,0x35,0x36,0x33,0x32,0x33,0x32,0x36,0x34,0x55,0x2c,0x20,0x30,0x78,0x34,0x45,0x33,0x41,0x33,0x41,0x37,0x34,0x55,0x2c,0x20,0x30,0x78,0x31,0x45,
|
||||||
0x2c,0x30,0x78,0x38,0x42,0x37,0x39,0x37,0x39,0x46,0x32,0x55,0x2c,0x0a,0x30,0x78,0x33,0x32,0x45,0x37,0x45,0x37,0x44,0x35,0x55,0x2c,0x30,0x78,0x34,0x33,0x43,0x38,
|
0x30,0x41,0x30,0x41,0x31,0x34,0x55,0x2c,0x0d,0x30,0x78,0x44,0x42,0x34,0x39,0x34,0x39,0x39,0x32,0x55,0x2c,0x20,0x30,0x78,0x30,0x41,0x30,0x36,0x30,0x36,0x30,0x43,
|
||||||
0x43,0x38,0x38,0x42,0x55,0x2c,0x30,0x78,0x35,0x39,0x33,0x37,0x33,0x37,0x36,0x45,0x55,0x2c,0x30,0x78,0x42,0x37,0x36,0x44,0x36,0x44,0x44,0x41,0x55,0x2c,0x0a,0x30,
|
0x55,0x2c,0x20,0x30,0x78,0x36,0x43,0x32,0x34,0x32,0x34,0x34,0x38,0x55,0x2c,0x20,0x30,0x78,0x45,0x34,0x35,0x43,0x35,0x43,0x42,0x38,0x55,0x2c,0x0d,0x30,0x78,0x35,
|
||||||
0x78,0x38,0x43,0x38,0x44,0x38,0x44,0x30,0x31,0x55,0x2c,0x30,0x78,0x36,0x34,0x44,0x35,0x44,0x35,0x42,0x31,0x55,0x2c,0x30,0x78,0x44,0x32,0x34,0x45,0x34,0x45,0x39,
|
0x44,0x43,0x32,0x43,0x32,0x39,0x46,0x55,0x2c,0x20,0x30,0x78,0x36,0x45,0x44,0x33,0x44,0x33,0x42,0x44,0x55,0x2c,0x20,0x30,0x78,0x45,0x46,0x41,0x43,0x41,0x43,0x34,
|
||||||
0x43,0x55,0x2c,0x30,0x78,0x45,0x30,0x41,0x39,0x41,0x39,0x34,0x39,0x55,0x2c,0x0a,0x30,0x78,0x42,0x34,0x36,0x43,0x36,0x43,0x44,0x38,0x55,0x2c,0x30,0x78,0x46,0x41,
|
0x33,0x55,0x2c,0x20,0x30,0x78,0x41,0x36,0x36,0x32,0x36,0x32,0x43,0x34,0x55,0x2c,0x0d,0x30,0x78,0x41,0x38,0x39,0x31,0x39,0x31,0x33,0x39,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x35,0x36,0x35,0x36,0x41,0x43,0x55,0x2c,0x30,0x78,0x30,0x37,0x46,0x34,0x46,0x34,0x46,0x33,0x55,0x2c,0x30,0x78,0x32,0x35,0x45,0x41,0x45,0x41,0x43,0x46,0x55,0x2c,
|
0x41,0x34,0x39,0x35,0x39,0x35,0x33,0x31,0x55,0x2c,0x20,0x30,0x78,0x33,0x37,0x45,0x34,0x45,0x34,0x44,0x33,0x55,0x2c,0x20,0x30,0x78,0x38,0x42,0x37,0x39,0x37,0x39,
|
||||||
0x0a,0x30,0x78,0x41,0x46,0x36,0x35,0x36,0x35,0x43,0x41,0x55,0x2c,0x30,0x78,0x38,0x45,0x37,0x41,0x37,0x41,0x46,0x34,0x55,0x2c,0x30,0x78,0x45,0x39,0x41,0x45,0x41,
|
0x46,0x32,0x55,0x2c,0x0d,0x30,0x78,0x33,0x32,0x45,0x37,0x45,0x37,0x44,0x35,0x55,0x2c,0x20,0x30,0x78,0x34,0x33,0x43,0x38,0x43,0x38,0x38,0x42,0x55,0x2c,0x20,0x30,
|
||||||
0x45,0x34,0x37,0x55,0x2c,0x30,0x78,0x31,0x38,0x30,0x38,0x30,0x38,0x31,0x30,0x55,0x2c,0x0a,0x30,0x78,0x44,0x35,0x42,0x41,0x42,0x41,0x36,0x46,0x55,0x2c,0x30,0x78,
|
0x78,0x35,0x39,0x33,0x37,0x33,0x37,0x36,0x45,0x55,0x2c,0x20,0x30,0x78,0x42,0x37,0x36,0x44,0x36,0x44,0x44,0x41,0x55,0x2c,0x0d,0x30,0x78,0x38,0x43,0x38,0x44,0x38,
|
||||||
0x38,0x38,0x37,0x38,0x37,0x38,0x46,0x30,0x55,0x2c,0x30,0x78,0x36,0x46,0x32,0x35,0x32,0x35,0x34,0x41,0x55,0x2c,0x30,0x78,0x37,0x32,0x32,0x45,0x32,0x45,0x35,0x43,
|
0x44,0x30,0x31,0x55,0x2c,0x20,0x30,0x78,0x36,0x34,0x44,0x35,0x44,0x35,0x42,0x31,0x55,0x2c,0x20,0x30,0x78,0x44,0x32,0x34,0x45,0x34,0x45,0x39,0x43,0x55,0x2c,0x20,
|
||||||
0x55,0x2c,0x0a,0x30,0x78,0x32,0x34,0x31,0x43,0x31,0x43,0x33,0x38,0x55,0x2c,0x30,0x78,0x46,0x31,0x41,0x36,0x41,0x36,0x35,0x37,0x55,0x2c,0x30,0x78,0x43,0x37,0x42,
|
0x30,0x78,0x45,0x30,0x41,0x39,0x41,0x39,0x34,0x39,0x55,0x2c,0x0d,0x30,0x78,0x42,0x34,0x36,0x43,0x36,0x43,0x44,0x38,0x55,0x2c,0x20,0x30,0x78,0x46,0x41,0x35,0x36,
|
||||||
0x34,0x42,0x34,0x37,0x33,0x55,0x2c,0x30,0x78,0x35,0x31,0x43,0x36,0x43,0x36,0x39,0x37,0x55,0x2c,0x0a,0x30,0x78,0x32,0x33,0x45,0x38,0x45,0x38,0x43,0x42,0x55,0x2c,
|
0x35,0x36,0x41,0x43,0x55,0x2c,0x20,0x30,0x78,0x30,0x37,0x46,0x34,0x46,0x34,0x46,0x33,0x55,0x2c,0x20,0x30,0x78,0x32,0x35,0x45,0x41,0x45,0x41,0x43,0x46,0x55,0x2c,
|
||||||
0x30,0x78,0x37,0x43,0x44,0x44,0x44,0x44,0x41,0x31,0x55,0x2c,0x30,0x78,0x39,0x43,0x37,0x34,0x37,0x34,0x45,0x38,0x55,0x2c,0x30,0x78,0x32,0x31,0x31,0x46,0x31,0x46,
|
0x0d,0x30,0x78,0x41,0x46,0x36,0x35,0x36,0x35,0x43,0x41,0x55,0x2c,0x20,0x30,0x78,0x38,0x45,0x37,0x41,0x37,0x41,0x46,0x34,0x55,0x2c,0x20,0x30,0x78,0x45,0x39,0x41,
|
||||||
0x33,0x45,0x55,0x2c,0x0a,0x30,0x78,0x44,0x44,0x34,0x42,0x34,0x42,0x39,0x36,0x55,0x2c,0x30,0x78,0x44,0x43,0x42,0x44,0x42,0x44,0x36,0x31,0x55,0x2c,0x30,0x78,0x38,
|
0x45,0x41,0x45,0x34,0x37,0x55,0x2c,0x20,0x30,0x78,0x31,0x38,0x30,0x38,0x30,0x38,0x31,0x30,0x55,0x2c,0x0d,0x30,0x78,0x44,0x35,0x42,0x41,0x42,0x41,0x36,0x46,0x55,
|
||||||
0x36,0x38,0x42,0x38,0x42,0x30,0x44,0x55,0x2c,0x30,0x78,0x38,0x35,0x38,0x41,0x38,0x41,0x30,0x46,0x55,0x2c,0x0a,0x30,0x78,0x39,0x30,0x37,0x30,0x37,0x30,0x45,0x30,
|
0x2c,0x20,0x30,0x78,0x38,0x38,0x37,0x38,0x37,0x38,0x46,0x30,0x55,0x2c,0x20,0x30,0x78,0x36,0x46,0x32,0x35,0x32,0x35,0x34,0x41,0x55,0x2c,0x20,0x30,0x78,0x37,0x32,
|
||||||
0x55,0x2c,0x30,0x78,0x34,0x32,0x33,0x45,0x33,0x45,0x37,0x43,0x55,0x2c,0x30,0x78,0x43,0x34,0x42,0x35,0x42,0x35,0x37,0x31,0x55,0x2c,0x30,0x78,0x41,0x41,0x36,0x36,
|
0x32,0x45,0x32,0x45,0x35,0x43,0x55,0x2c,0x0d,0x30,0x78,0x32,0x34,0x31,0x43,0x31,0x43,0x33,0x38,0x55,0x2c,0x20,0x30,0x78,0x46,0x31,0x41,0x36,0x41,0x36,0x35,0x37,
|
||||||
0x36,0x36,0x43,0x43,0x55,0x2c,0x0a,0x30,0x78,0x44,0x38,0x34,0x38,0x34,0x38,0x39,0x30,0x55,0x2c,0x30,0x78,0x30,0x35,0x30,0x33,0x30,0x33,0x30,0x36,0x55,0x2c,0x30,
|
0x55,0x2c,0x20,0x30,0x78,0x43,0x37,0x42,0x34,0x42,0x34,0x37,0x33,0x55,0x2c,0x20,0x30,0x78,0x35,0x31,0x43,0x36,0x43,0x36,0x39,0x37,0x55,0x2c,0x0d,0x30,0x78,0x32,
|
||||||
0x78,0x30,0x31,0x46,0x36,0x46,0x36,0x46,0x37,0x55,0x2c,0x30,0x78,0x31,0x32,0x30,0x45,0x30,0x45,0x31,0x43,0x55,0x2c,0x0a,0x30,0x78,0x41,0x33,0x36,0x31,0x36,0x31,
|
0x33,0x45,0x38,0x45,0x38,0x43,0x42,0x55,0x2c,0x20,0x30,0x78,0x37,0x43,0x44,0x44,0x44,0x44,0x41,0x31,0x55,0x2c,0x20,0x30,0x78,0x39,0x43,0x37,0x34,0x37,0x34,0x45,
|
||||||
0x43,0x32,0x55,0x2c,0x30,0x78,0x35,0x46,0x33,0x35,0x33,0x35,0x36,0x41,0x55,0x2c,0x30,0x78,0x46,0x39,0x35,0x37,0x35,0x37,0x41,0x45,0x55,0x2c,0x30,0x78,0x44,0x30,
|
0x38,0x55,0x2c,0x20,0x30,0x78,0x32,0x31,0x31,0x46,0x31,0x46,0x33,0x45,0x55,0x2c,0x0d,0x30,0x78,0x44,0x44,0x34,0x42,0x34,0x42,0x39,0x36,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x42,0x39,0x42,0x39,0x36,0x39,0x55,0x2c,0x0a,0x30,0x78,0x39,0x31,0x38,0x36,0x38,0x36,0x31,0x37,0x55,0x2c,0x30,0x78,0x35,0x38,0x43,0x31,0x43,0x31,0x39,0x39,0x55,
|
0x44,0x43,0x42,0x44,0x42,0x44,0x36,0x31,0x55,0x2c,0x20,0x30,0x78,0x38,0x36,0x38,0x42,0x38,0x42,0x30,0x44,0x55,0x2c,0x20,0x30,0x78,0x38,0x35,0x38,0x41,0x38,0x41,
|
||||||
0x2c,0x30,0x78,0x32,0x37,0x31,0x44,0x31,0x44,0x33,0x41,0x55,0x2c,0x30,0x78,0x42,0x39,0x39,0x45,0x39,0x45,0x32,0x37,0x55,0x2c,0x0a,0x30,0x78,0x33,0x38,0x45,0x31,
|
0x30,0x46,0x55,0x2c,0x0d,0x30,0x78,0x39,0x30,0x37,0x30,0x37,0x30,0x45,0x30,0x55,0x2c,0x20,0x30,0x78,0x34,0x32,0x33,0x45,0x33,0x45,0x37,0x43,0x55,0x2c,0x20,0x30,
|
||||||
0x45,0x31,0x44,0x39,0x55,0x2c,0x30,0x78,0x31,0x33,0x46,0x38,0x46,0x38,0x45,0x42,0x55,0x2c,0x30,0x78,0x42,0x33,0x39,0x38,0x39,0x38,0x32,0x42,0x55,0x2c,0x30,0x78,
|
0x78,0x43,0x34,0x42,0x35,0x42,0x35,0x37,0x31,0x55,0x2c,0x20,0x30,0x78,0x41,0x41,0x36,0x36,0x36,0x36,0x43,0x43,0x55,0x2c,0x0d,0x30,0x78,0x44,0x38,0x34,0x38,0x34,
|
||||||
0x33,0x33,0x31,0x31,0x31,0x31,0x32,0x32,0x55,0x2c,0x0a,0x30,0x78,0x42,0x42,0x36,0x39,0x36,0x39,0x44,0x32,0x55,0x2c,0x30,0x78,0x37,0x30,0x44,0x39,0x44,0x39,0x41,
|
0x38,0x39,0x30,0x55,0x2c,0x20,0x30,0x78,0x30,0x35,0x30,0x33,0x30,0x33,0x30,0x36,0x55,0x2c,0x20,0x30,0x78,0x30,0x31,0x46,0x36,0x46,0x36,0x46,0x37,0x55,0x2c,0x20,
|
||||||
0x39,0x55,0x2c,0x30,0x78,0x38,0x39,0x38,0x45,0x38,0x45,0x30,0x37,0x55,0x2c,0x30,0x78,0x41,0x37,0x39,0x34,0x39,0x34,0x33,0x33,0x55,0x2c,0x0a,0x30,0x78,0x42,0x36,
|
0x30,0x78,0x31,0x32,0x30,0x45,0x30,0x45,0x31,0x43,0x55,0x2c,0x0d,0x30,0x78,0x41,0x33,0x36,0x31,0x36,0x31,0x43,0x32,0x55,0x2c,0x20,0x30,0x78,0x35,0x46,0x33,0x35,
|
||||||
0x39,0x42,0x39,0x42,0x32,0x44,0x55,0x2c,0x30,0x78,0x32,0x32,0x31,0x45,0x31,0x45,0x33,0x43,0x55,0x2c,0x30,0x78,0x39,0x32,0x38,0x37,0x38,0x37,0x31,0x35,0x55,0x2c,
|
0x33,0x35,0x36,0x41,0x55,0x2c,0x20,0x30,0x78,0x46,0x39,0x35,0x37,0x35,0x37,0x41,0x45,0x55,0x2c,0x20,0x30,0x78,0x44,0x30,0x42,0x39,0x42,0x39,0x36,0x39,0x55,0x2c,
|
||||||
0x30,0x78,0x32,0x30,0x45,0x39,0x45,0x39,0x43,0x39,0x55,0x2c,0x0a,0x30,0x78,0x34,0x39,0x43,0x45,0x43,0x45,0x38,0x37,0x55,0x2c,0x30,0x78,0x46,0x46,0x35,0x35,0x35,
|
0x0d,0x30,0x78,0x39,0x31,0x38,0x36,0x38,0x36,0x31,0x37,0x55,0x2c,0x20,0x30,0x78,0x35,0x38,0x43,0x31,0x43,0x31,0x39,0x39,0x55,0x2c,0x20,0x30,0x78,0x32,0x37,0x31,
|
||||||
0x35,0x41,0x41,0x55,0x2c,0x30,0x78,0x37,0x38,0x32,0x38,0x32,0x38,0x35,0x30,0x55,0x2c,0x30,0x78,0x37,0x41,0x44,0x46,0x44,0x46,0x41,0x35,0x55,0x2c,0x0a,0x30,0x78,
|
0x44,0x31,0x44,0x33,0x41,0x55,0x2c,0x20,0x30,0x78,0x42,0x39,0x39,0x45,0x39,0x45,0x32,0x37,0x55,0x2c,0x0d,0x30,0x78,0x33,0x38,0x45,0x31,0x45,0x31,0x44,0x39,0x55,
|
||||||
0x38,0x46,0x38,0x43,0x38,0x43,0x30,0x33,0x55,0x2c,0x30,0x78,0x46,0x38,0x41,0x31,0x41,0x31,0x35,0x39,0x55,0x2c,0x30,0x78,0x38,0x30,0x38,0x39,0x38,0x39,0x30,0x39,
|
0x2c,0x20,0x30,0x78,0x31,0x33,0x46,0x38,0x46,0x38,0x45,0x42,0x55,0x2c,0x20,0x30,0x78,0x42,0x33,0x39,0x38,0x39,0x38,0x32,0x42,0x55,0x2c,0x20,0x30,0x78,0x33,0x33,
|
||||||
0x55,0x2c,0x30,0x78,0x31,0x37,0x30,0x44,0x30,0x44,0x31,0x41,0x55,0x2c,0x0a,0x30,0x78,0x44,0x41,0x42,0x46,0x42,0x46,0x36,0x35,0x55,0x2c,0x30,0x78,0x33,0x31,0x45,
|
0x31,0x31,0x31,0x31,0x32,0x32,0x55,0x2c,0x0d,0x30,0x78,0x42,0x42,0x36,0x39,0x36,0x39,0x44,0x32,0x55,0x2c,0x20,0x30,0x78,0x37,0x30,0x44,0x39,0x44,0x39,0x41,0x39,
|
||||||
0x36,0x45,0x36,0x44,0x37,0x55,0x2c,0x30,0x78,0x43,0x36,0x34,0x32,0x34,0x32,0x38,0x34,0x55,0x2c,0x30,0x78,0x42,0x38,0x36,0x38,0x36,0x38,0x44,0x30,0x55,0x2c,0x0a,
|
0x55,0x2c,0x20,0x30,0x78,0x38,0x39,0x38,0x45,0x38,0x45,0x30,0x37,0x55,0x2c,0x20,0x30,0x78,0x41,0x37,0x39,0x34,0x39,0x34,0x33,0x33,0x55,0x2c,0x0d,0x30,0x78,0x42,
|
||||||
0x30,0x78,0x43,0x33,0x34,0x31,0x34,0x31,0x38,0x32,0x55,0x2c,0x30,0x78,0x42,0x30,0x39,0x39,0x39,0x39,0x32,0x39,0x55,0x2c,0x30,0x78,0x37,0x37,0x32,0x44,0x32,0x44,
|
0x36,0x39,0x42,0x39,0x42,0x32,0x44,0x55,0x2c,0x20,0x30,0x78,0x32,0x32,0x31,0x45,0x31,0x45,0x33,0x43,0x55,0x2c,0x20,0x30,0x78,0x39,0x32,0x38,0x37,0x38,0x37,0x31,
|
||||||
0x35,0x41,0x55,0x2c,0x30,0x78,0x31,0x31,0x30,0x46,0x30,0x46,0x31,0x45,0x55,0x2c,0x0a,0x30,0x78,0x43,0x42,0x42,0x30,0x42,0x30,0x37,0x42,0x55,0x2c,0x30,0x78,0x46,
|
0x35,0x55,0x2c,0x20,0x30,0x78,0x32,0x30,0x45,0x39,0x45,0x39,0x43,0x39,0x55,0x2c,0x0d,0x30,0x78,0x34,0x39,0x43,0x45,0x43,0x45,0x38,0x37,0x55,0x2c,0x20,0x30,0x78,
|
||||||
0x43,0x35,0x34,0x35,0x34,0x41,0x38,0x55,0x2c,0x30,0x78,0x44,0x36,0x42,0x42,0x42,0x42,0x36,0x44,0x55,0x2c,0x30,0x78,0x33,0x41,0x31,0x36,0x31,0x36,0x32,0x43,0x55,
|
0x46,0x46,0x35,0x35,0x35,0x35,0x41,0x41,0x55,0x2c,0x20,0x30,0x78,0x37,0x38,0x32,0x38,0x32,0x38,0x35,0x30,0x55,0x2c,0x20,0x30,0x78,0x37,0x41,0x44,0x46,0x44,0x46,
|
||||||
0x0a,0x7d,0x3b,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x42,0x59,0x54,0x45,0x28,0x78,0x2c,0x20,0x79,0x29,0x20,0x28,0x78,0x6d,0x72,0x69,0x67,0x5f,0x61,0x6d,
|
0x41,0x35,0x55,0x2c,0x0d,0x30,0x78,0x38,0x46,0x38,0x43,0x38,0x43,0x30,0x33,0x55,0x2c,0x20,0x30,0x78,0x46,0x38,0x41,0x31,0x41,0x31,0x35,0x39,0x55,0x2c,0x20,0x30,
|
||||||
0x64,0x5f,0x62,0x66,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x79,0x29,0x20,0x3c,0x3c,0x20,0x33,0x55,0x2c,0x20,0x38,0x55,0x29,0x29,0x0a,0x23,0x69,0x66,0x20,0x28,
|
0x78,0x38,0x30,0x38,0x39,0x38,0x39,0x30,0x39,0x55,0x2c,0x20,0x30,0x78,0x31,0x37,0x30,0x44,0x30,0x44,0x31,0x41,0x55,0x2c,0x0d,0x30,0x78,0x44,0x41,0x42,0x46,0x42,
|
||||||
0x41,0x4c,0x47,0x4f,0x20,0x3d,0x3d,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x43,0x4e,0x5f,0x48,0x45,0x41,0x56,0x59,0x5f,0x54,0x55,0x42,0x45,0x29,0x0a,0x69,0x6e,0x6c,0x69,
|
0x46,0x36,0x35,0x55,0x2c,0x20,0x30,0x78,0x33,0x31,0x45,0x36,0x45,0x36,0x44,0x37,0x55,0x2c,0x20,0x30,0x78,0x43,0x36,0x34,0x32,0x34,0x32,0x38,0x34,0x55,0x2c,0x20,
|
||||||
0x6e,0x65,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x5f,0x62,0x69,0x74,0x74,0x75,0x62,0x65,0x32,0x28,0x63,0x6f,0x6e,0x73,
|
0x30,0x78,0x42,0x38,0x36,0x38,0x36,0x38,0x44,0x30,0x55,0x2c,0x0d,0x30,0x78,0x43,0x33,0x34,0x31,0x34,0x31,0x38,0x32,0x55,0x2c,0x20,0x30,0x78,0x42,0x30,0x39,0x39,
|
||||||
0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,
|
0x39,0x39,0x32,0x39,0x55,0x2c,0x20,0x30,0x78,0x37,0x37,0x32,0x44,0x32,0x44,0x35,0x41,0x55,0x2c,0x20,0x30,0x78,0x31,0x31,0x30,0x46,0x30,0x46,0x31,0x45,0x55,0x2c,
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x78,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x29,0x0a,0x7b,
|
0x0d,0x30,0x78,0x43,0x42,0x42,0x30,0x42,0x30,0x37,0x42,0x55,0x2c,0x20,0x30,0x78,0x46,0x43,0x35,0x34,0x35,0x34,0x41,0x38,0x55,0x2c,0x20,0x30,0x78,0x44,0x36,0x42,
|
||||||
0x0a,0x78,0x3d,0x7e,0x78,0x3b,0x0a,0x6b,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x30,0x29,
|
0x42,0x42,0x42,0x36,0x44,0x55,0x2c,0x20,0x30,0x78,0x33,0x41,0x31,0x36,0x31,0x36,0x32,0x43,0x55,0x0d,0x7d,0x3b,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x42,
|
||||||
0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,
|
0x59,0x54,0x45,0x28,0x78,0x2c,0x20,0x79,0x29,0x20,0x28,0x78,0x6d,0x72,0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x79,
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x33,0x29,
|
0x29,0x20,0x3c,0x3c,0x20,0x33,0x55,0x2c,0x20,0x38,0x55,0x29,0x29,0x0d,0x23,0x69,0x66,0x20,0x28,0x41,0x4c,0x47,0x4f,0x20,0x3d,0x3d,0x20,0x41,0x4c,0x47,0x4f,0x5f,
|
||||||
0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x78,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x30,0x3b,0x0a,0x6b,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,
|
0x43,0x4e,0x5f,0x48,0x45,0x41,0x56,0x59,0x5f,0x54,0x55,0x42,0x45,0x29,0x0d,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,
|
||||||
0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,
|
0x52,0x6f,0x75,0x6e,0x64,0x5f,0x62,0x69,0x74,0x74,0x75,0x62,0x65,0x32,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,
|
||||||
0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,
|
0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,
|
||||||
0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x78,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x6b,
|
0x31,0x2c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x78,0x2c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x29,0x0d,0x7b,0x0d,0x78,0x20,0x3d,0x20,0x7e,0x78,0x3b,0x0d,0x6b,
|
||||||
0x2e,0x73,0x31,0x3b,0x0a,0x6b,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x30,0x29,0x5d,0x5e,
|
0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,
|
||||||
0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,
|
0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,
|
||||||
0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x33,0x29,0x5d,0x2c,
|
0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x20,
|
||||||
0x31,0x36,0x55,0x29,0x3b,0x0a,0x78,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x32,0x3b,0x0a,0x6b,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,
|
0x33,0x29,0x5d,0x2c,0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x78,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x30,0x3b,0x0d,0x6b,0x2e,0x73,0x31,0x20,0x5e,0x3d,
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x31,0x29,
|
0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,
|
||||||
0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,
|
0x28,0x78,0x2e,0x73,0x32,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x3b,0x0a,0x7d,
|
0x73,0x33,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x20,0x33,0x29,0x5d,0x2c,0x20,0x31,
|
||||||
0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,
|
0x36,0x55,0x29,0x3b,0x0d,0x78,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x31,0x3b,0x0d,0x6b,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,
|
||||||
0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,
|
0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,
|
||||||
0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,
|
0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x20,0x32,0x29,
|
||||||
0x53,0x32,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x33,0x2c,0x63,0x6f,0x6e,0x73,
|
0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x20,0x33,0x29,0x5d,0x2c,0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x78,
|
||||||
0x74,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x58,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x79,0x29,0x0a,0x7b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x30,0x20,0x5e,0x3d,
|
0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x32,0x3b,0x0d,0x6b,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,
|
||||||
0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,
|
0x2e,0x73,0x33,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,
|
||||||
0x73,0x31,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x33,0x5b,0x42,
|
0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,
|
||||||
0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x33,0x29,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,
|
0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x20,0x33,0x29,0x5d,0x2c,0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,
|
||||||
0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,
|
0x6b,0x3b,0x0d,0x7d,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x28,0x63,0x6f,0x6e,0x73,
|
||||||
0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,
|
0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,
|
||||||
0x33,0x29,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x30,0x29,
|
0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,
|
||||||
0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,
|
0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x32,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,
|
||||||
0x2e,0x73,0x30,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x33,0x29,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x2e,
|
0x53,0x33,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x58,0x2c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x79,0x29,0x0d,0x7b,0x0d,
|
||||||
0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,
|
0x6b,0x65,0x79,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,
|
||||||
0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x32,0x29,0x5d,0x5e,0x41,
|
0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,
|
||||||
0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x33,0x29,0x5d,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x65,0x79,0x3b,0x0a,0x7d,
|
0x58,0x2e,0x73,0x32,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,0x33,0x29,0x5d,0x3b,
|
||||||
0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x5f,0x54,0x77,0x6f,0x5f,0x54,0x61,0x62,0x6c,0x65,0x73,0x28,0x63,0x6f,0x6e,0x73,
|
0x0d,0x6b,0x65,0x79,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,
|
||||||
0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,
|
0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x58,0x2c,0x75,0x69,0x6e,0x74,
|
0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x33,0x29,0x5d,
|
||||||
0x34,0x20,0x6b,0x65,0x79,0x29,0x0a,0x7b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,
|
0x3b,0x0d,0x6b,0x65,0x79,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x30,0x29,0x5d,0x20,
|
||||||
0x30,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,
|
0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,
|
||||||
0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,
|
0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x33,0x29,
|
||||||
0x33,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,
|
0x5d,0x3b,0x0d,0x6b,0x65,0x79,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,0x30,0x29,0x5d,
|
||||||
0x58,0x2e,0x73,0x31,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,
|
0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,
|
||||||
0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,
|
0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x33,
|
||||||
0x58,0x2e,0x73,0x30,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,
|
0x29,0x5d,0x3b,0x0d,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x65,0x79,0x3b,0x0d,0x7d,0x0d,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,
|
||||||
0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x31,0x29,0x5d,0x5e,0x72,
|
0x64,0x5f,0x54,0x77,0x6f,0x5f,0x54,0x61,0x62,0x6c,0x65,0x73,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,
|
||||||
0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,
|
0x2a,0x41,0x45,0x53,0x30,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,
|
||||||
0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,
|
0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x58,0x2c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x79,0x29,0x0d,0x7b,0x0d,0x6b,0x65,0x79,
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x31,0x29,
|
0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,
|
||||||
0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,
|
0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x65,0x79,0x3b,
|
0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,
|
||||||
0x0a,0x7d,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x63,0x68,0x61,0x72,
|
0x33,0x29,0x5d,0x2c,0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x6b,0x65,0x79,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,
|
||||||
0x20,0x72,0x63,0x6f,0x6e,0x5b,0x38,0x5d,0x3d,0x7b,0x20,0x30,0x78,0x38,0x64,0x2c,0x30,0x78,0x30,0x31,0x2c,0x30,0x78,0x30,0x32,0x2c,0x30,0x78,0x30,0x34,0x2c,0x30,
|
0x2e,0x73,0x31,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,
|
||||||
0x78,0x30,0x38,0x2c,0x30,0x78,0x31,0x30,0x2c,0x30,0x78,0x32,0x30,0x2c,0x30,0x78,0x34,0x30,0x20,0x7d,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,
|
0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,
|
||||||
0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x73,0x62,0x6f,0x78,0x5b,0x32,0x35,0x36,0x5d,0x20,0x3d,0x0a,
|
0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x33,0x29,0x5d,0x2c,0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x6b,0x65,0x79,0x2e,0x73,0x32,0x20,
|
||||||
0x7b,0x0a,0x30,0x78,0x36,0x33,0x2c,0x30,0x78,0x37,0x43,0x2c,0x30,0x78,0x37,0x37,0x2c,0x30,0x78,0x37,0x42,0x2c,0x30,0x78,0x46,0x32,0x2c,0x30,0x78,0x36,0x42,0x2c,
|
0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,
|
||||||
0x30,0x78,0x36,0x46,0x2c,0x30,0x78,0x43,0x35,0x2c,0x30,0x78,0x33,0x30,0x2c,0x30,0x78,0x30,0x31,0x2c,0x30,0x78,0x36,0x37,0x2c,0x30,0x78,0x32,0x42,0x2c,0x30,0x78,
|
0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,
|
||||||
0x46,0x45,0x2c,0x30,0x78,0x44,0x37,0x2c,0x30,0x78,0x41,0x42,0x2c,0x30,0x78,0x37,0x36,0x2c,0x0a,0x30,0x78,0x43,0x41,0x2c,0x30,0x78,0x38,0x32,0x2c,0x30,0x78,0x43,
|
0x58,0x2e,0x73,0x30,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x33,0x29,0x5d,0x2c,
|
||||||
0x39,0x2c,0x30,0x78,0x37,0x44,0x2c,0x30,0x78,0x46,0x41,0x2c,0x30,0x78,0x35,0x39,0x2c,0x30,0x78,0x34,0x37,0x2c,0x30,0x78,0x46,0x30,0x2c,0x30,0x78,0x41,0x44,0x2c,
|
0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x6b,0x65,0x79,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,
|
||||||
0x30,0x78,0x44,0x34,0x2c,0x30,0x78,0x41,0x32,0x2c,0x30,0x78,0x41,0x46,0x2c,0x30,0x78,0x39,0x43,0x2c,0x30,0x78,0x41,0x34,0x2c,0x30,0x78,0x37,0x32,0x2c,0x30,0x78,
|
0x20,0x30,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x20,0x31,0x29,0x5d,0x20,0x5e,0x20,0x72,0x6f,0x74,
|
||||||
0x43,0x30,0x2c,0x0a,0x30,0x78,0x42,0x37,0x2c,0x30,0x78,0x46,0x44,0x2c,0x30,0x78,0x39,0x33,0x2c,0x30,0x78,0x32,0x36,0x2c,0x30,0x78,0x33,0x36,0x2c,0x30,0x78,0x33,
|
0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x20,0x32,0x29,0x5d,0x20,0x5e,0x20,0x41,0x45,0x53,0x31,0x5b,0x42,
|
||||||
0x46,0x2c,0x30,0x78,0x46,0x37,0x2c,0x30,0x78,0x43,0x43,0x2c,0x30,0x78,0x33,0x34,0x2c,0x30,0x78,0x41,0x35,0x2c,0x30,0x78,0x45,0x35,0x2c,0x30,0x78,0x46,0x31,0x2c,
|
0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x20,0x33,0x29,0x5d,0x2c,0x20,0x31,0x36,0x55,0x29,0x3b,0x0d,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x65,0x79,0x3b,
|
||||||
0x30,0x78,0x37,0x31,0x2c,0x30,0x78,0x44,0x38,0x2c,0x30,0x78,0x33,0x31,0x2c,0x30,0x78,0x31,0x35,0x2c,0x0a,0x30,0x78,0x30,0x34,0x2c,0x30,0x78,0x43,0x37,0x2c,0x30,
|
0x0d,0x7d,0x0d,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x63,0x68,0x61,0x72,
|
||||||
0x78,0x32,0x33,0x2c,0x30,0x78,0x43,0x33,0x2c,0x30,0x78,0x31,0x38,0x2c,0x30,0x78,0x39,0x36,0x2c,0x30,0x78,0x30,0x35,0x2c,0x30,0x78,0x39,0x41,0x2c,0x30,0x78,0x30,
|
0x20,0x72,0x63,0x6f,0x6e,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x20,0x30,0x78,0x38,0x64,0x2c,0x20,0x30,0x78,0x30,0x31,0x2c,0x20,0x30,0x78,0x30,0x32,0x2c,0x20,0x30,
|
||||||
0x37,0x2c,0x30,0x78,0x31,0x32,0x2c,0x30,0x78,0x38,0x30,0x2c,0x30,0x78,0x45,0x32,0x2c,0x30,0x78,0x45,0x42,0x2c,0x30,0x78,0x32,0x37,0x2c,0x30,0x78,0x42,0x32,0x2c,
|
0x78,0x30,0x34,0x2c,0x20,0x30,0x78,0x30,0x38,0x2c,0x20,0x30,0x78,0x31,0x30,0x2c,0x20,0x30,0x78,0x32,0x30,0x2c,0x20,0x30,0x78,0x34,0x30,0x20,0x7d,0x3b,0x0d,0x73,
|
||||||
0x30,0x78,0x37,0x35,0x2c,0x0a,0x30,0x78,0x30,0x39,0x2c,0x30,0x78,0x38,0x33,0x2c,0x30,0x78,0x32,0x43,0x2c,0x30,0x78,0x31,0x41,0x2c,0x30,0x78,0x31,0x42,0x2c,0x30,
|
0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x73,0x62,0x6f,
|
||||||
0x78,0x36,0x45,0x2c,0x30,0x78,0x35,0x41,0x2c,0x30,0x78,0x41,0x30,0x2c,0x30,0x78,0x35,0x32,0x2c,0x30,0x78,0x33,0x42,0x2c,0x30,0x78,0x44,0x36,0x2c,0x30,0x78,0x42,
|
0x78,0x5b,0x32,0x35,0x36,0x5d,0x20,0x3d,0x0d,0x7b,0x0d,0x30,0x78,0x36,0x33,0x2c,0x20,0x30,0x78,0x37,0x43,0x2c,0x20,0x30,0x78,0x37,0x37,0x2c,0x20,0x30,0x78,0x37,
|
||||||
0x33,0x2c,0x30,0x78,0x32,0x39,0x2c,0x30,0x78,0x45,0x33,0x2c,0x30,0x78,0x32,0x46,0x2c,0x30,0x78,0x38,0x34,0x2c,0x0a,0x30,0x78,0x35,0x33,0x2c,0x30,0x78,0x44,0x31,
|
0x42,0x2c,0x20,0x30,0x78,0x46,0x32,0x2c,0x20,0x30,0x78,0x36,0x42,0x2c,0x20,0x30,0x78,0x36,0x46,0x2c,0x20,0x30,0x78,0x43,0x35,0x2c,0x20,0x30,0x78,0x33,0x30,0x2c,
|
||||||
0x2c,0x30,0x78,0x30,0x30,0x2c,0x30,0x78,0x45,0x44,0x2c,0x30,0x78,0x32,0x30,0x2c,0x30,0x78,0x46,0x43,0x2c,0x30,0x78,0x42,0x31,0x2c,0x30,0x78,0x35,0x42,0x2c,0x30,
|
0x20,0x30,0x78,0x30,0x31,0x2c,0x20,0x30,0x78,0x36,0x37,0x2c,0x20,0x30,0x78,0x32,0x42,0x2c,0x20,0x30,0x78,0x46,0x45,0x2c,0x20,0x30,0x78,0x44,0x37,0x2c,0x20,0x30,
|
||||||
0x78,0x36,0x41,0x2c,0x30,0x78,0x43,0x42,0x2c,0x30,0x78,0x42,0x45,0x2c,0x30,0x78,0x33,0x39,0x2c,0x30,0x78,0x34,0x41,0x2c,0x30,0x78,0x34,0x43,0x2c,0x30,0x78,0x35,
|
0x78,0x41,0x42,0x2c,0x20,0x30,0x78,0x37,0x36,0x2c,0x0d,0x30,0x78,0x43,0x41,0x2c,0x20,0x30,0x78,0x38,0x32,0x2c,0x20,0x30,0x78,0x43,0x39,0x2c,0x20,0x30,0x78,0x37,
|
||||||
0x38,0x2c,0x30,0x78,0x43,0x46,0x2c,0x0a,0x30,0x78,0x44,0x30,0x2c,0x30,0x78,0x45,0x46,0x2c,0x30,0x78,0x41,0x41,0x2c,0x30,0x78,0x46,0x42,0x2c,0x30,0x78,0x34,0x33,
|
0x44,0x2c,0x20,0x30,0x78,0x46,0x41,0x2c,0x20,0x30,0x78,0x35,0x39,0x2c,0x20,0x30,0x78,0x34,0x37,0x2c,0x20,0x30,0x78,0x46,0x30,0x2c,0x20,0x30,0x78,0x41,0x44,0x2c,
|
||||||
0x2c,0x30,0x78,0x34,0x44,0x2c,0x30,0x78,0x33,0x33,0x2c,0x30,0x78,0x38,0x35,0x2c,0x30,0x78,0x34,0x35,0x2c,0x30,0x78,0x46,0x39,0x2c,0x30,0x78,0x30,0x32,0x2c,0x30,
|
0x20,0x30,0x78,0x44,0x34,0x2c,0x20,0x30,0x78,0x41,0x32,0x2c,0x20,0x30,0x78,0x41,0x46,0x2c,0x20,0x30,0x78,0x39,0x43,0x2c,0x20,0x30,0x78,0x41,0x34,0x2c,0x20,0x30,
|
||||||
0x78,0x37,0x46,0x2c,0x30,0x78,0x35,0x30,0x2c,0x30,0x78,0x33,0x43,0x2c,0x30,0x78,0x39,0x46,0x2c,0x30,0x78,0x41,0x38,0x2c,0x0a,0x30,0x78,0x35,0x31,0x2c,0x30,0x78,
|
0x78,0x37,0x32,0x2c,0x20,0x30,0x78,0x43,0x30,0x2c,0x0d,0x30,0x78,0x42,0x37,0x2c,0x20,0x30,0x78,0x46,0x44,0x2c,0x20,0x30,0x78,0x39,0x33,0x2c,0x20,0x30,0x78,0x32,
|
||||||
0x41,0x33,0x2c,0x30,0x78,0x34,0x30,0x2c,0x30,0x78,0x38,0x46,0x2c,0x30,0x78,0x39,0x32,0x2c,0x30,0x78,0x39,0x44,0x2c,0x30,0x78,0x33,0x38,0x2c,0x30,0x78,0x46,0x35,
|
0x36,0x2c,0x20,0x30,0x78,0x33,0x36,0x2c,0x20,0x30,0x78,0x33,0x46,0x2c,0x20,0x30,0x78,0x46,0x37,0x2c,0x20,0x30,0x78,0x43,0x43,0x2c,0x20,0x30,0x78,0x33,0x34,0x2c,
|
||||||
0x2c,0x30,0x78,0x42,0x43,0x2c,0x30,0x78,0x42,0x36,0x2c,0x30,0x78,0x44,0x41,0x2c,0x30,0x78,0x32,0x31,0x2c,0x30,0x78,0x31,0x30,0x2c,0x30,0x78,0x46,0x46,0x2c,0x30,
|
0x20,0x30,0x78,0x41,0x35,0x2c,0x20,0x30,0x78,0x45,0x35,0x2c,0x20,0x30,0x78,0x46,0x31,0x2c,0x20,0x30,0x78,0x37,0x31,0x2c,0x20,0x30,0x78,0x44,0x38,0x2c,0x20,0x30,
|
||||||
0x78,0x46,0x33,0x2c,0x30,0x78,0x44,0x32,0x2c,0x0a,0x30,0x78,0x43,0x44,0x2c,0x30,0x78,0x30,0x43,0x2c,0x30,0x78,0x31,0x33,0x2c,0x30,0x78,0x45,0x43,0x2c,0x30,0x78,
|
0x78,0x33,0x31,0x2c,0x20,0x30,0x78,0x31,0x35,0x2c,0x0d,0x30,0x78,0x30,0x34,0x2c,0x20,0x30,0x78,0x43,0x37,0x2c,0x20,0x30,0x78,0x32,0x33,0x2c,0x20,0x30,0x78,0x43,
|
||||||
0x35,0x46,0x2c,0x30,0x78,0x39,0x37,0x2c,0x30,0x78,0x34,0x34,0x2c,0x30,0x78,0x31,0x37,0x2c,0x30,0x78,0x43,0x34,0x2c,0x30,0x78,0x41,0x37,0x2c,0x30,0x78,0x37,0x45,
|
0x33,0x2c,0x20,0x30,0x78,0x31,0x38,0x2c,0x20,0x30,0x78,0x39,0x36,0x2c,0x20,0x30,0x78,0x30,0x35,0x2c,0x20,0x30,0x78,0x39,0x41,0x2c,0x20,0x30,0x78,0x30,0x37,0x2c,
|
||||||
0x2c,0x30,0x78,0x33,0x44,0x2c,0x30,0x78,0x36,0x34,0x2c,0x30,0x78,0x35,0x44,0x2c,0x30,0x78,0x31,0x39,0x2c,0x30,0x78,0x37,0x33,0x2c,0x0a,0x30,0x78,0x36,0x30,0x2c,
|
0x20,0x30,0x78,0x31,0x32,0x2c,0x20,0x30,0x78,0x38,0x30,0x2c,0x20,0x30,0x78,0x45,0x32,0x2c,0x20,0x30,0x78,0x45,0x42,0x2c,0x20,0x30,0x78,0x32,0x37,0x2c,0x20,0x30,
|
||||||
0x30,0x78,0x38,0x31,0x2c,0x30,0x78,0x34,0x46,0x2c,0x30,0x78,0x44,0x43,0x2c,0x30,0x78,0x32,0x32,0x2c,0x30,0x78,0x32,0x41,0x2c,0x30,0x78,0x39,0x30,0x2c,0x30,0x78,
|
0x78,0x42,0x32,0x2c,0x20,0x30,0x78,0x37,0x35,0x2c,0x0d,0x30,0x78,0x30,0x39,0x2c,0x20,0x30,0x78,0x38,0x33,0x2c,0x20,0x30,0x78,0x32,0x43,0x2c,0x20,0x30,0x78,0x31,
|
||||||
0x38,0x38,0x2c,0x30,0x78,0x34,0x36,0x2c,0x30,0x78,0x45,0x45,0x2c,0x30,0x78,0x42,0x38,0x2c,0x30,0x78,0x31,0x34,0x2c,0x30,0x78,0x44,0x45,0x2c,0x30,0x78,0x35,0x45,
|
0x41,0x2c,0x20,0x30,0x78,0x31,0x42,0x2c,0x20,0x30,0x78,0x36,0x45,0x2c,0x20,0x30,0x78,0x35,0x41,0x2c,0x20,0x30,0x78,0x41,0x30,0x2c,0x20,0x30,0x78,0x35,0x32,0x2c,
|
||||||
0x2c,0x30,0x78,0x30,0x42,0x2c,0x30,0x78,0x44,0x42,0x2c,0x0a,0x30,0x78,0x45,0x30,0x2c,0x30,0x78,0x33,0x32,0x2c,0x30,0x78,0x33,0x41,0x2c,0x30,0x78,0x30,0x41,0x2c,
|
0x20,0x30,0x78,0x33,0x42,0x2c,0x20,0x30,0x78,0x44,0x36,0x2c,0x20,0x30,0x78,0x42,0x33,0x2c,0x20,0x30,0x78,0x32,0x39,0x2c,0x20,0x30,0x78,0x45,0x33,0x2c,0x20,0x30,
|
||||||
0x30,0x78,0x34,0x39,0x2c,0x30,0x78,0x30,0x36,0x2c,0x30,0x78,0x32,0x34,0x2c,0x30,0x78,0x35,0x43,0x2c,0x30,0x78,0x43,0x32,0x2c,0x30,0x78,0x44,0x33,0x2c,0x30,0x78,
|
0x78,0x32,0x46,0x2c,0x20,0x30,0x78,0x38,0x34,0x2c,0x0d,0x30,0x78,0x35,0x33,0x2c,0x20,0x30,0x78,0x44,0x31,0x2c,0x20,0x30,0x78,0x30,0x30,0x2c,0x20,0x30,0x78,0x45,
|
||||||
0x41,0x43,0x2c,0x30,0x78,0x36,0x32,0x2c,0x30,0x78,0x39,0x31,0x2c,0x30,0x78,0x39,0x35,0x2c,0x30,0x78,0x45,0x34,0x2c,0x30,0x78,0x37,0x39,0x2c,0x0a,0x30,0x78,0x45,
|
0x44,0x2c,0x20,0x30,0x78,0x32,0x30,0x2c,0x20,0x30,0x78,0x46,0x43,0x2c,0x20,0x30,0x78,0x42,0x31,0x2c,0x20,0x30,0x78,0x35,0x42,0x2c,0x20,0x30,0x78,0x36,0x41,0x2c,
|
||||||
0x37,0x2c,0x30,0x78,0x43,0x38,0x2c,0x30,0x78,0x33,0x37,0x2c,0x30,0x78,0x36,0x44,0x2c,0x30,0x78,0x38,0x44,0x2c,0x30,0x78,0x44,0x35,0x2c,0x30,0x78,0x34,0x45,0x2c,
|
0x20,0x30,0x78,0x43,0x42,0x2c,0x20,0x30,0x78,0x42,0x45,0x2c,0x20,0x30,0x78,0x33,0x39,0x2c,0x20,0x30,0x78,0x34,0x41,0x2c,0x20,0x30,0x78,0x34,0x43,0x2c,0x20,0x30,
|
||||||
0x30,0x78,0x41,0x39,0x2c,0x30,0x78,0x36,0x43,0x2c,0x30,0x78,0x35,0x36,0x2c,0x30,0x78,0x46,0x34,0x2c,0x30,0x78,0x45,0x41,0x2c,0x30,0x78,0x36,0x35,0x2c,0x30,0x78,
|
0x78,0x35,0x38,0x2c,0x20,0x30,0x78,0x43,0x46,0x2c,0x0d,0x30,0x78,0x44,0x30,0x2c,0x20,0x30,0x78,0x45,0x46,0x2c,0x20,0x30,0x78,0x41,0x41,0x2c,0x20,0x30,0x78,0x46,
|
||||||
0x37,0x41,0x2c,0x30,0x78,0x41,0x45,0x2c,0x30,0x78,0x30,0x38,0x2c,0x0a,0x30,0x78,0x42,0x41,0x2c,0x30,0x78,0x37,0x38,0x2c,0x30,0x78,0x32,0x35,0x2c,0x30,0x78,0x32,
|
0x42,0x2c,0x20,0x30,0x78,0x34,0x33,0x2c,0x20,0x30,0x78,0x34,0x44,0x2c,0x20,0x30,0x78,0x33,0x33,0x2c,0x20,0x30,0x78,0x38,0x35,0x2c,0x20,0x30,0x78,0x34,0x35,0x2c,
|
||||||
0x45,0x2c,0x30,0x78,0x31,0x43,0x2c,0x30,0x78,0x41,0x36,0x2c,0x30,0x78,0x42,0x34,0x2c,0x30,0x78,0x43,0x36,0x2c,0x30,0x78,0x45,0x38,0x2c,0x30,0x78,0x44,0x44,0x2c,
|
0x20,0x30,0x78,0x46,0x39,0x2c,0x20,0x30,0x78,0x30,0x32,0x2c,0x20,0x30,0x78,0x37,0x46,0x2c,0x20,0x30,0x78,0x35,0x30,0x2c,0x20,0x30,0x78,0x33,0x43,0x2c,0x20,0x30,
|
||||||
0x30,0x78,0x37,0x34,0x2c,0x30,0x78,0x31,0x46,0x2c,0x30,0x78,0x34,0x42,0x2c,0x30,0x78,0x42,0x44,0x2c,0x30,0x78,0x38,0x42,0x2c,0x30,0x78,0x38,0x41,0x2c,0x0a,0x30,
|
0x78,0x39,0x46,0x2c,0x20,0x30,0x78,0x41,0x38,0x2c,0x0d,0x30,0x78,0x35,0x31,0x2c,0x20,0x30,0x78,0x41,0x33,0x2c,0x20,0x30,0x78,0x34,0x30,0x2c,0x20,0x30,0x78,0x38,
|
||||||
0x78,0x37,0x30,0x2c,0x30,0x78,0x33,0x45,0x2c,0x30,0x78,0x42,0x35,0x2c,0x30,0x78,0x36,0x36,0x2c,0x30,0x78,0x34,0x38,0x2c,0x30,0x78,0x30,0x33,0x2c,0x30,0x78,0x46,
|
0x46,0x2c,0x20,0x30,0x78,0x39,0x32,0x2c,0x20,0x30,0x78,0x39,0x44,0x2c,0x20,0x30,0x78,0x33,0x38,0x2c,0x20,0x30,0x78,0x46,0x35,0x2c,0x20,0x30,0x78,0x42,0x43,0x2c,
|
||||||
0x36,0x2c,0x30,0x78,0x30,0x45,0x2c,0x30,0x78,0x36,0x31,0x2c,0x30,0x78,0x33,0x35,0x2c,0x30,0x78,0x35,0x37,0x2c,0x30,0x78,0x42,0x39,0x2c,0x30,0x78,0x38,0x36,0x2c,
|
0x20,0x30,0x78,0x42,0x36,0x2c,0x20,0x30,0x78,0x44,0x41,0x2c,0x20,0x30,0x78,0x32,0x31,0x2c,0x20,0x30,0x78,0x31,0x30,0x2c,0x20,0x30,0x78,0x46,0x46,0x2c,0x20,0x30,
|
||||||
0x30,0x78,0x43,0x31,0x2c,0x30,0x78,0x31,0x44,0x2c,0x30,0x78,0x39,0x45,0x2c,0x0a,0x30,0x78,0x45,0x31,0x2c,0x30,0x78,0x46,0x38,0x2c,0x30,0x78,0x39,0x38,0x2c,0x30,
|
0x78,0x46,0x33,0x2c,0x20,0x30,0x78,0x44,0x32,0x2c,0x0d,0x30,0x78,0x43,0x44,0x2c,0x20,0x30,0x78,0x30,0x43,0x2c,0x20,0x30,0x78,0x31,0x33,0x2c,0x20,0x30,0x78,0x45,
|
||||||
0x78,0x31,0x31,0x2c,0x30,0x78,0x36,0x39,0x2c,0x30,0x78,0x44,0x39,0x2c,0x30,0x78,0x38,0x45,0x2c,0x30,0x78,0x39,0x34,0x2c,0x30,0x78,0x39,0x42,0x2c,0x30,0x78,0x31,
|
0x43,0x2c,0x20,0x30,0x78,0x35,0x46,0x2c,0x20,0x30,0x78,0x39,0x37,0x2c,0x20,0x30,0x78,0x34,0x34,0x2c,0x20,0x30,0x78,0x31,0x37,0x2c,0x20,0x30,0x78,0x43,0x34,0x2c,
|
||||||
0x45,0x2c,0x30,0x78,0x38,0x37,0x2c,0x30,0x78,0x45,0x39,0x2c,0x30,0x78,0x43,0x45,0x2c,0x30,0x78,0x35,0x35,0x2c,0x30,0x78,0x32,0x38,0x2c,0x30,0x78,0x44,0x46,0x2c,
|
0x20,0x30,0x78,0x41,0x37,0x2c,0x20,0x30,0x78,0x37,0x45,0x2c,0x20,0x30,0x78,0x33,0x44,0x2c,0x20,0x30,0x78,0x36,0x34,0x2c,0x20,0x30,0x78,0x35,0x44,0x2c,0x20,0x30,
|
||||||
0x0a,0x30,0x78,0x38,0x43,0x2c,0x30,0x78,0x41,0x31,0x2c,0x30,0x78,0x38,0x39,0x2c,0x30,0x78,0x30,0x44,0x2c,0x30,0x78,0x42,0x46,0x2c,0x30,0x78,0x45,0x36,0x2c,0x30,
|
0x78,0x31,0x39,0x2c,0x20,0x30,0x78,0x37,0x33,0x2c,0x0d,0x30,0x78,0x36,0x30,0x2c,0x20,0x30,0x78,0x38,0x31,0x2c,0x20,0x30,0x78,0x34,0x46,0x2c,0x20,0x30,0x78,0x44,
|
||||||
0x78,0x34,0x32,0x2c,0x30,0x78,0x36,0x38,0x2c,0x30,0x78,0x34,0x31,0x2c,0x30,0x78,0x39,0x39,0x2c,0x30,0x78,0x32,0x44,0x2c,0x30,0x78,0x30,0x46,0x2c,0x30,0x78,0x42,
|
0x43,0x2c,0x20,0x30,0x78,0x32,0x32,0x2c,0x20,0x30,0x78,0x32,0x41,0x2c,0x20,0x30,0x78,0x39,0x30,0x2c,0x20,0x30,0x78,0x38,0x38,0x2c,0x20,0x30,0x78,0x34,0x36,0x2c,
|
||||||
0x30,0x2c,0x30,0x78,0x35,0x34,0x2c,0x30,0x78,0x42,0x42,0x2c,0x30,0x78,0x31,0x36,0x0a,0x7d,0x3b,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x75,0x62,0x57,
|
0x20,0x30,0x78,0x45,0x45,0x2c,0x20,0x30,0x78,0x42,0x38,0x2c,0x20,0x30,0x78,0x31,0x34,0x2c,0x20,0x30,0x78,0x44,0x45,0x2c,0x20,0x30,0x78,0x35,0x45,0x2c,0x20,0x30,
|
||||||
0x6f,0x72,0x64,0x28,0x69,0x6e,0x77,0x29,0x20,0x28,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x33,0x29,0x5d,0x20,0x3c,0x3c,
|
0x78,0x30,0x42,0x2c,0x20,0x30,0x78,0x44,0x42,0x2c,0x0d,0x30,0x78,0x45,0x30,0x2c,0x20,0x30,0x78,0x33,0x32,0x2c,0x20,0x30,0x78,0x33,0x41,0x2c,0x20,0x30,0x78,0x30,
|
||||||
0x20,0x32,0x34,0x29,0x20,0x7c,0x20,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x32,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x31,0x36,
|
0x41,0x2c,0x20,0x30,0x78,0x34,0x39,0x2c,0x20,0x30,0x78,0x30,0x36,0x2c,0x20,0x30,0x78,0x32,0x34,0x2c,0x20,0x30,0x78,0x35,0x43,0x2c,0x20,0x30,0x78,0x43,0x32,0x2c,
|
||||||
0x29,0x20,0x7c,0x20,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x31,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x38,0x29,0x20,0x7c,0x20,
|
0x20,0x30,0x78,0x44,0x33,0x2c,0x20,0x30,0x78,0x41,0x43,0x2c,0x20,0x30,0x78,0x36,0x32,0x2c,0x20,0x30,0x78,0x39,0x31,0x2c,0x20,0x30,0x78,0x39,0x35,0x2c,0x20,0x30,
|
||||||
0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x30,0x29,0x5d,0x29,0x0a,0x76,0x6f,0x69,0x64,0x20,0x41,0x45,0x53,0x45,0x78,0x70,0x61,
|
0x78,0x45,0x34,0x2c,0x20,0x30,0x78,0x37,0x39,0x2c,0x0d,0x30,0x78,0x45,0x37,0x2c,0x20,0x30,0x78,0x43,0x38,0x2c,0x20,0x30,0x78,0x33,0x37,0x2c,0x20,0x30,0x78,0x36,
|
||||||
0x6e,0x64,0x4b,0x65,0x79,0x32,0x35,0x36,0x28,0x75,0x69,0x6e,0x74,0x20,0x2a,0x6b,0x65,0x79,0x62,0x75,0x66,0x29,0x0a,0x7b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,
|
0x44,0x2c,0x20,0x30,0x78,0x38,0x44,0x2c,0x20,0x30,0x78,0x44,0x35,0x2c,0x20,0x30,0x78,0x34,0x45,0x2c,0x20,0x30,0x78,0x41,0x39,0x2c,0x20,0x30,0x78,0x36,0x43,0x2c,
|
||||||
0x6e,0x74,0x20,0x63,0x3d,0x38,0x2c,0x69,0x3d,0x31,0x3b,0x20,0x63,0x3c,0x34,0x30,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x20,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x74,0x3d,
|
0x20,0x30,0x78,0x35,0x36,0x2c,0x20,0x30,0x78,0x46,0x34,0x2c,0x20,0x30,0x78,0x45,0x41,0x2c,0x20,0x30,0x78,0x36,0x35,0x2c,0x20,0x30,0x78,0x37,0x41,0x2c,0x20,0x30,
|
||||||
0x28,0x28,0x21,0x28,0x63,0x26,0x37,0x29,0x29,0x7c,0x7c,0x28,0x28,0x63,0x26,0x37,0x29,0x3d,0x3d,0x34,0x29,0x29,0x3f,0x53,0x75,0x62,0x57,0x6f,0x72,0x64,0x28,0x6b,
|
0x78,0x41,0x45,0x2c,0x20,0x30,0x78,0x30,0x38,0x2c,0x0d,0x30,0x78,0x42,0x41,0x2c,0x20,0x30,0x78,0x37,0x38,0x2c,0x20,0x30,0x78,0x32,0x35,0x2c,0x20,0x30,0x78,0x32,
|
||||||
0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x2d,0x31,0x5d,0x29,0x3a,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x2d,0x31,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,
|
0x45,0x2c,0x20,0x30,0x78,0x31,0x43,0x2c,0x20,0x30,0x78,0x41,0x36,0x2c,0x20,0x30,0x78,0x42,0x34,0x2c,0x20,0x30,0x78,0x43,0x36,0x2c,0x20,0x30,0x78,0x45,0x38,0x2c,
|
||||||
0x63,0x5d,0x3d,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x2d,0x38,0x5d,0x5e,0x28,0x28,0x21,0x28,0x63,0x26,0x37,0x29,0x29,0x3f,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,
|
0x20,0x30,0x78,0x44,0x44,0x2c,0x20,0x30,0x78,0x37,0x34,0x2c,0x20,0x30,0x78,0x31,0x46,0x2c,0x20,0x30,0x78,0x34,0x42,0x2c,0x20,0x30,0x78,0x42,0x44,0x2c,0x20,0x30,
|
||||||
0x74,0x2c,0x32,0x34,0x55,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x28,0x75,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x72,0x63,0x6f,0x6e,0x5b,0x69,0x2b,0x2b,
|
0x78,0x38,0x42,0x2c,0x20,0x30,0x78,0x38,0x41,0x2c,0x0d,0x30,0x78,0x37,0x30,0x2c,0x20,0x30,0x78,0x33,0x45,0x2c,0x20,0x30,0x78,0x42,0x35,0x2c,0x20,0x30,0x78,0x36,
|
||||||
0x5d,0x2c,0x30,0x55,0x2c,0x30,0x55,0x2c,0x30,0x55,0x29,0x29,0x3a,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x00
|
0x36,0x2c,0x20,0x30,0x78,0x34,0x38,0x2c,0x20,0x30,0x78,0x30,0x33,0x2c,0x20,0x30,0x78,0x46,0x36,0x2c,0x20,0x30,0x78,0x30,0x45,0x2c,0x20,0x30,0x78,0x36,0x31,0x2c,
|
||||||
|
0x20,0x30,0x78,0x33,0x35,0x2c,0x20,0x30,0x78,0x35,0x37,0x2c,0x20,0x30,0x78,0x42,0x39,0x2c,0x20,0x30,0x78,0x38,0x36,0x2c,0x20,0x30,0x78,0x43,0x31,0x2c,0x20,0x30,
|
||||||
|
0x78,0x31,0x44,0x2c,0x20,0x30,0x78,0x39,0x45,0x2c,0x0d,0x30,0x78,0x45,0x31,0x2c,0x20,0x30,0x78,0x46,0x38,0x2c,0x20,0x30,0x78,0x39,0x38,0x2c,0x20,0x30,0x78,0x31,
|
||||||
|
0x31,0x2c,0x20,0x30,0x78,0x36,0x39,0x2c,0x20,0x30,0x78,0x44,0x39,0x2c,0x20,0x30,0x78,0x38,0x45,0x2c,0x20,0x30,0x78,0x39,0x34,0x2c,0x20,0x30,0x78,0x39,0x42,0x2c,
|
||||||
|
0x20,0x30,0x78,0x31,0x45,0x2c,0x20,0x30,0x78,0x38,0x37,0x2c,0x20,0x30,0x78,0x45,0x39,0x2c,0x20,0x30,0x78,0x43,0x45,0x2c,0x20,0x30,0x78,0x35,0x35,0x2c,0x20,0x30,
|
||||||
|
0x78,0x32,0x38,0x2c,0x20,0x30,0x78,0x44,0x46,0x2c,0x0d,0x30,0x78,0x38,0x43,0x2c,0x20,0x30,0x78,0x41,0x31,0x2c,0x20,0x30,0x78,0x38,0x39,0x2c,0x20,0x30,0x78,0x30,
|
||||||
|
0x44,0x2c,0x20,0x30,0x78,0x42,0x46,0x2c,0x20,0x30,0x78,0x45,0x36,0x2c,0x20,0x30,0x78,0x34,0x32,0x2c,0x20,0x30,0x78,0x36,0x38,0x2c,0x20,0x30,0x78,0x34,0x31,0x2c,
|
||||||
|
0x20,0x30,0x78,0x39,0x39,0x2c,0x20,0x30,0x78,0x32,0x44,0x2c,0x20,0x30,0x78,0x30,0x46,0x2c,0x20,0x30,0x78,0x42,0x30,0x2c,0x20,0x30,0x78,0x35,0x34,0x2c,0x20,0x30,
|
||||||
|
0x78,0x42,0x42,0x2c,0x20,0x30,0x78,0x31,0x36,0x0d,0x7d,0x3b,0x0d,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x75,0x62,0x57,0x6f,0x72,0x64,0x28,0x69,0x6e,0x77,
|
||||||
|
0x29,0x20,0x28,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x33,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x32,0x34,0x29,0x20,0x7c,0x20,
|
||||||
|
0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x32,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x31,0x36,0x29,0x20,0x7c,0x20,0x28,0x73,0x62,
|
||||||
|
0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x31,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x38,0x29,0x20,0x7c,0x20,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,
|
||||||
|
0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x30,0x29,0x5d,0x29,0x0d,0x76,0x6f,0x69,0x64,0x20,0x41,0x45,0x53,0x45,0x78,0x70,0x61,0x6e,0x64,0x4b,0x65,0x79,0x32,0x35,
|
||||||
|
0x36,0x28,0x75,0x69,0x6e,0x74,0x20,0x2a,0x6b,0x65,0x79,0x62,0x75,0x66,0x29,0x0d,0x7b,0x0d,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,
|
||||||
|
0x38,0x2c,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x63,0x20,0x3c,0x20,0x34,0x30,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x20,0x7b,0x0d,0x75,0x69,0x6e,0x74,0x20,0x74,0x20,
|
||||||
|
0x3d,0x20,0x28,0x28,0x21,0x28,0x63,0x20,0x26,0x20,0x37,0x29,0x29,0x20,0x7c,0x7c,0x20,0x28,0x28,0x63,0x20,0x26,0x20,0x37,0x29,0x20,0x3d,0x3d,0x20,0x34,0x29,0x29,
|
||||||
|
0x20,0x3f,0x20,0x53,0x75,0x62,0x57,0x6f,0x72,0x64,0x28,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x20,0x2d,0x20,0x31,0x5d,0x29,0x20,0x3a,0x20,0x6b,0x65,0x79,0x62,
|
||||||
|
0x75,0x66,0x5b,0x63,0x20,0x2d,0x20,0x31,0x5d,0x3b,0x0d,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x5d,0x20,0x3d,0x20,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x20,
|
||||||
|
0x2d,0x20,0x38,0x5d,0x20,0x5e,0x20,0x28,0x28,0x21,0x28,0x63,0x20,0x26,0x20,0x37,0x29,0x29,0x20,0x3f,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x2c,0x20,0x32,
|
||||||
|
0x34,0x55,0x29,0x20,0x5e,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x28,0x75,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x72,0x63,0x6f,0x6e,0x5b,0x69,0x2b,0x2b,0x5d,
|
||||||
|
0x2c,0x20,0x30,0x55,0x2c,0x20,0x30,0x55,0x2c,0x20,0x30,0x55,0x29,0x29,0x20,0x3a,0x20,0x74,0x29,0x3b,0x0d,0x7d,0x0d,0x7d,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,
|
||||||
|
0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
static char cryptonight_r_cl[3424] = {
|
static char cryptonight_r_cl[3415] = {
|
||||||
0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,
|
0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,
|
||||||
0x69,0x7a,0x65,0x28,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x2c,0x31,0x2c,0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,
|
0x69,0x7a,0x65,0x28,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x2c,0x31,0x2c,0x31,0x29,0x29,0x29,0x0d,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,
|
||||||
0x64,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x4e,0x41,0x4d,0x45,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x69,0x6e,
|
0x64,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x4e,0x41,0x4d,0x45,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x69,0x6e,
|
||||||
0x70,0x75,0x74,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2c,0x5f,
|
0x70,0x75,0x74,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2c,0x5f,
|
||||||
0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x73,0x74,0x61,0x74,0x65,0x73,0x2c,0x75,0x69,0x6e,0x74,0x20,0x54,0x68,0x72,0x65,0x61,
|
0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x73,0x74,0x61,0x74,0x65,0x73,0x2c,0x75,0x69,0x6e,0x74,0x20,0x54,0x68,0x72,0x65,0x61,
|
||||||
0x64,0x73,0x29,0x0a,0x7b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x61,0x5b,0x32,0x5d,0x2c,0x62,0x5b,0x34,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,
|
0x64,0x73,0x29,0x0d,0x7b,0x0d,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x61,0x5b,0x32,0x5d,0x2c,0x62,0x5b,0x34,0x5d,0x3b,0x0d,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,
|
||||||
0x69,0x6e,0x74,0x20,0x41,0x45,0x53,0x30,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,0x31,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,0x32,0x5b,0x32,0x35,0x36,
|
0x69,0x6e,0x74,0x20,0x41,0x45,0x53,0x30,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,0x31,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,0x32,0x5b,0x32,0x35,0x36,
|
||||||
0x5d,0x2c,0x41,0x45,0x53,0x33,0x5b,0x32,0x35,0x36,0x5d,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x67,0x49,0x64,0x78,0x3d,0x67,0x65,
|
0x5d,0x2c,0x41,0x45,0x53,0x33,0x5b,0x32,0x35,0x36,0x5d,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x67,0x49,0x64,0x78,0x3d,0x67,0x65,
|
||||||
0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2d,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,
|
0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2d,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,
|
||||||
0x28,0x30,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,
|
0x28,0x30,0x29,0x3b,0x0d,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,
|
||||||
0x69,0x3c,0x32,0x35,0x36,0x3b,0x20,0x69,0x2b,0x3d,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,
|
0x69,0x3c,0x32,0x35,0x36,0x3b,0x20,0x69,0x2b,0x3d,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,
|
||||||
0x20,0x74,0x6d,0x70,0x3d,0x41,0x45,0x53,0x30,0x5f,0x43,0x5b,0x69,0x5d,0x3b,0x0a,0x41,0x45,0x53,0x30,0x5b,0x69,0x5d,0x3d,0x74,0x6d,0x70,0x3b,0x0a,0x41,0x45,0x53,
|
0x20,0x74,0x6d,0x70,0x3d,0x41,0x45,0x53,0x30,0x5f,0x43,0x5b,0x69,0x5d,0x3b,0x0d,0x41,0x45,0x53,0x30,0x5b,0x69,0x5d,0x3d,0x74,0x6d,0x70,0x3b,0x0d,0x41,0x45,0x53,
|
||||||
0x31,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,0x38,0x55,0x29,0x3b,0x0a,0x41,0x45,0x53,0x32,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,
|
0x31,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,0x38,0x55,0x29,0x3b,0x0d,0x41,0x45,0x53,0x32,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,
|
||||||
0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x41,0x45,0x53,0x33,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x6d,0x70,
|
0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0d,0x41,0x45,0x53,0x33,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x6d,0x70,
|
||||||
0x2c,0x32,0x34,0x55,0x29,0x3b,0x0a,0x7d,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,
|
0x2c,0x32,0x34,0x55,0x29,0x3b,0x0d,0x7d,0x0d,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,
|
||||||
0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x7b,0x0a,0x73,0x74,0x61,0x74,0x65,0x73,0x2b,0x3d,0x32,0x35,0x2a,0x67,0x49,0x64,0x78,0x3b,0x0a,0x23,0x69,0x66,0x20,0x64,0x65,
|
0x45,0x4e,0x43,0x45,0x29,0x3b,0x0d,0x7b,0x0d,0x73,0x74,0x61,0x74,0x65,0x73,0x2b,0x3d,0x32,0x35,0x2a,0x67,0x49,0x64,0x78,0x3b,0x0d,0x23,0x69,0x66,0x20,0x64,0x65,
|
||||||
0x66,0x69,0x6e,0x65,0x64,0x28,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x29,0x0a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,
|
0x66,0x69,0x6e,0x65,0x64,0x28,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x29,0x0d,0x53,0x63,0x72,0x61,0x74,0x63,0x68,
|
||||||
0x70,0x61,0x64,0x2b,0x3d,0x67,0x49,0x64,0x78,0x2a,0x28,0x49,0x54,0x45,0x52,0x41,0x54,0x49,0x4f,0x4e,0x53,0x3e,0x3e,0x32,0x29,0x3b,0x0a,0x23,0x65,0x6c,0x73,0x65,
|
0x70,0x61,0x64,0x2b,0x3d,0x67,0x49,0x64,0x78,0x2a,0x28,0x49,0x54,0x45,0x52,0x41,0x54,0x49,0x4f,0x4e,0x53,0x3e,0x3e,0x32,0x29,0x3b,0x0d,0x23,0x65,0x6c,0x73,0x65,
|
||||||
0x0a,0x23,0x69,0x66,0x20,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x30,0x29,0x0a,0x53,0x63,0x72,0x61,0x74,0x63,
|
0x0d,0x23,0x69,0x66,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x3d,0x3d,0x30,0x29,0x0d,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,
|
||||||
0x68,0x70,0x61,0x64,0x2b,0x3d,0x67,0x49,0x64,0x78,0x2a,0x28,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x3e,0x3e,0x34,0x29,0x3b,0x0a,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x53,
|
0x64,0x2b,0x3d,0x67,0x49,0x64,0x78,0x2a,0x28,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x3e,0x3e,0x34,0x29,0x3b,0x0d,0x23,0x65,0x6c,0x69,0x66,0x28,0x53,0x54,0x52,0x49,0x44,
|
||||||
0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x3d,0x67,
|
0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x3d,0x3d,0x31,0x29,0x0d,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x3d,0x67,0x49,0x64,0x78,0x3b,0x0d,0x23,
|
||||||
0x49,0x64,0x78,0x3b,0x0a,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x20,0x3d,0x3d,0x20,0x32,0x29,0x0a,
|
0x65,0x6c,0x69,0x66,0x28,0x53,0x54,0x52,0x49,0x44,0x45,0x44,0x5f,0x49,0x4e,0x44,0x45,0x58,0x3d,0x3d,0x32,0x29,0x0d,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,
|
||||||
0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x3d,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x2a,0x28,0x4d,0x45,0x4d,
|
0x64,0x2b,0x3d,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x2a,0x28,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x3e,0x3e,0x34,0x29,0x2a,0x57,
|
||||||
0x4f,0x52,0x59,0x3e,0x3e,0x34,0x29,0x2a,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x2b,0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x2a,0x67,0x65,0x74,0x5f,0x6c,
|
0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x2b,0x4d,0x45,0x4d,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x2a,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,
|
||||||
0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x61,0x5b,0x30,0x5d,0x3d,0x73,
|
0x29,0x3b,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x61,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x30,0x5d,0x5e,
|
||||||
0x74,0x61,0x74,0x65,0x73,0x5b,0x30,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x34,0x5d,0x3b,0x0a,0x61,0x5b,0x31,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,
|
0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x34,0x5d,0x3b,0x0d,0x61,0x5b,0x31,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,
|
||||||
0x31,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x35,0x5d,0x3b,0x0a,0x62,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x32,0x5d,0x5e,0x73,0x74,0x61,
|
0x5b,0x35,0x5d,0x3b,0x0d,0x62,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x32,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x36,0x5d,0x3b,0x0d,0x62,
|
||||||
0x74,0x65,0x73,0x5b,0x36,0x5d,0x3b,0x0a,0x62,0x5b,0x31,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x33,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x37,0x5d,
|
0x5b,0x31,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x33,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x37,0x5d,0x3b,0x0d,0x62,0x5b,0x32,0x5d,0x3d,0x73,0x74,
|
||||||
0x3b,0x0a,0x62,0x5b,0x32,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x38,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x30,0x5d,0x3b,0x0a,0x62,0x5b,0x33,
|
0x61,0x74,0x65,0x73,0x5b,0x38,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x30,0x5d,0x3b,0x0d,0x62,0x5b,0x33,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,
|
||||||
0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x39,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x31,0x5d,0x3b,0x0a,0x7d,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x32,
|
0x39,0x5d,0x5e,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x31,0x5d,0x3b,0x0d,0x7d,0x0d,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x62,0x78,0x30,0x3d,0x28,0x28,0x75,0x6c,
|
||||||
0x20,0x62,0x78,0x30,0x3d,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x2a,0x29,0x62,0x29,0x5b,0x30,0x5d,0x3b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x62,0x78,
|
0x6f,0x6e,0x67,0x32,0x20,0x2a,0x29,0x62,0x29,0x5b,0x30,0x5d,0x3b,0x0d,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x62,0x78,0x31,0x3d,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,
|
||||||
0x31,0x3d,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x2a,0x29,0x62,0x29,0x5b,0x31,0x5d,0x3b,0x0a,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,
|
0x32,0x20,0x2a,0x29,0x62,0x29,0x5b,0x31,0x5d,0x3b,0x0d,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,
|
||||||
0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,
|
0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0d,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,
|
||||||
0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x20,0x73,0x63,0x72,0x61,
|
0x49,0x4f,0x4e,0x0d,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x20,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,
|
||||||
0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x5f,0x62,0x75,0x66,0x5b,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,
|
0x6e,0x65,0x5f,0x62,0x75,0x66,0x5b,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x5d,0x3b,0x0d,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x20,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3d,0x73,0x63,0x72,0x61,0x74,
|
0x2a,0x20,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3d,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,
|
||||||
0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x5f,0x62,0x75,0x66,0x2b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0a,
|
0x65,0x5f,0x62,0x75,0x66,0x2b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x7b,0x0d,
|
||||||
0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x72,0x30,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,0x65,0x73,
|
0x75,0x69,0x6e,0x74,0x20,0x72,0x30,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x32,0x5d,0x29,0x2e,0x73,0x30,0x3b,
|
||||||
0x5b,0x31,0x32,0x5d,0x29,0x2e,0x73,0x30,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x72,0x31,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,0x65,
|
0x0d,0x75,0x69,0x6e,0x74,0x20,0x72,0x31,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x32,0x5d,0x29,0x2e,0x73,0x31,
|
||||||
0x73,0x5b,0x31,0x32,0x5d,0x29,0x2e,0x73,0x31,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x72,0x32,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,
|
0x3b,0x0d,0x75,0x69,0x6e,0x74,0x20,0x72,0x32,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x33,0x5d,0x29,0x2e,0x73,
|
||||||
0x65,0x73,0x5b,0x31,0x33,0x5d,0x29,0x2e,0x73,0x30,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x72,0x33,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,
|
0x30,0x3b,0x0d,0x75,0x69,0x6e,0x74,0x20,0x72,0x33,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x31,0x33,0x5d,0x29,0x2e,
|
||||||
0x74,0x65,0x73,0x5b,0x31,0x33,0x5d,0x29,0x2e,0x73,0x31,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x43,0x4e,0x5f,0x55,
|
0x73,0x31,0x3b,0x0d,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x43,0x4e,0x5f,0x55,0x4e,0x52,0x4f,0x4c,0x4c,0x0d,0x66,0x6f,0x72,
|
||||||
0x4e,0x52,0x4f,0x4c,0x4c,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x49,0x54,0x45,0x52,0x41,0x54,0x49,0x4f,0x4e,0x53,
|
0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x49,0x54,0x45,0x52,0x41,0x54,0x49,0x4f,0x4e,0x53,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0d,
|
||||||
0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,
|
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0d,0x75,0x69,0x6e,0x74,0x20,0x69,0x64,
|
||||||
0x4e,0x0a,0x75,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x3d,0x61,0x5b,0x30,0x5d,0x26,0x30,0x78,0x31,0x46,0x46,0x46,0x43,0x30,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x69,
|
0x78,0x3d,0x61,0x5b,0x30,0x5d,0x26,0x30,0x78,0x31,0x46,0x46,0x46,0x43,0x30,0x3b,0x0d,0x75,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x31,0x3d,0x61,0x5b,0x30,0x5d,0x26,
|
||||||
0x64,0x78,0x31,0x3d,0x61,0x5b,0x30,0x5d,0x26,0x30,0x78,0x33,0x30,0x3b,0x0a,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3d,
|
0x30,0x78,0x33,0x30,0x3b,0x0d,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3d,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,
|
||||||
0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,
|
0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,
|
||||||
0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,0x78,0x29,0x3b,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x75,0x69,
|
0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,0x78,0x29,0x3b,0x0d,0x23,0x65,0x6c,0x73,0x65,0x0d,0x75,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x3d,0x61,0x5b,
|
||||||
0x6e,0x74,0x20,0x69,0x64,0x78,0x3d,0x61,0x5b,0x30,0x5d,0x26,0x4d,0x41,0x53,0x4b,0x3b,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x63,
|
0x30,0x5d,0x26,0x4d,0x41,0x53,0x4b,0x3b,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x75,0x69,0x6e,0x74,0x34,0x20,0x63,0x3d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,
|
||||||
0x3d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,0x29,0x3b,0x0a,0x63,0x3d,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,
|
0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,0x29,0x3b,0x0d,0x63,0x3d,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x28,0x41,0x45,0x53,0x30,0x2c,0x41,0x45,
|
||||||
0x64,0x28,0x41,0x45,0x53,0x30,0x2c,0x41,0x45,0x53,0x31,0x2c,0x41,0x45,0x53,0x32,0x2c,0x41,0x45,0x53,0x33,0x2c,0x63,0x2c,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,
|
0x53,0x31,0x2c,0x41,0x45,0x53,0x32,0x2c,0x41,0x45,0x53,0x33,0x2c,0x63,0x2c,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x29,0x3b,
|
||||||
0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x29,0x3b,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x31,0x3d,
|
0x0d,0x7b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x31,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,
|
||||||
0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x29,0x3b,0x0a,
|
0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x29,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,
|
||||||
0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x32,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,
|
0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x32,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,
|
||||||
0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x29,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,
|
0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x29,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x33,0x3d,0x61,
|
||||||
0x20,0x63,0x68,0x75,0x6e,0x6b,0x33,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,
|
0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,0x29,0x29,0x3b,0x0d,0x63,
|
||||||
0x4e,0x4b,0x28,0x33,0x29,0x29,0x3b,0x0a,0x63,0x20,0x5e,0x3d,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x29,0x5e,0x61,0x73,
|
0x20,0x5e,0x3d,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,
|
||||||
0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x32,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x29,0x3b,
|
0x75,0x6e,0x6b,0x32,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x29,0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,
|
||||||
0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,
|
0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x2b,0x62,0x78,0x31,0x29,
|
||||||
0x75,0x6e,0x6b,0x33,0x2b,0x62,0x78,0x31,0x29,0x3b,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x3d,0x61,
|
0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,
|
||||||
0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x2b,0x62,0x78,0x30,0x29,0x3b,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,
|
0x68,0x75,0x6e,0x6b,0x31,0x2b,0x62,0x78,0x30,0x29,0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,0x29,0x3d,
|
||||||
0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x32,0x2b,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,
|
0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x32,0x2b,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,
|
||||||
0x32,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x29,0x3b,0x0a,0x7d,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,
|
0x29,0x3b,0x0d,0x7d,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,
|
||||||
0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x30,0x29,0x5e,0x63,0x3b,0x0a,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,
|
0x34,0x28,0x62,0x78,0x30,0x29,0x5e,0x63,0x3b,0x0d,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,
|
||||||
0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,
|
0x4f,0x4e,0x0d,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,
|
||||||
|
0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,0x78,0x29,0x3d,0x2a,0x73,0x63,0x72,0x61,0x74,
|
||||||
|
0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3b,0x0d,0x69,0x64,0x78,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x26,
|
||||||
|
0x30,0x78,0x31,0x46,0x46,0x46,0x43,0x30,0x3b,0x0d,0x69,0x64,0x78,0x31,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x26,0x30,
|
||||||
|
0x78,0x33,0x30,0x3b,0x0d,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3d,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,
|
||||||
|
0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,
|
||||||
|
0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,0x78,0x29,0x3b,0x0d,0x23,0x65,0x6c,0x73,0x65,0x0d,0x69,0x64,0x78,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,
|
||||||
|
0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x26,0x4d,0x41,0x53,0x4b,0x3b,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x75,0x69,0x6e,0x74,0x34,0x20,0x74,0x6d,0x70,0x3d,0x53,
|
||||||
|
0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,0x29,0x3b,0x0d,0x74,0x6d,0x70,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x72,0x30,
|
||||||
|
0x2b,0x72,0x31,0x3b,0x0d,0x74,0x6d,0x70,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x72,0x32,0x2b,0x72,0x33,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,
|
||||||
|
0x20,0x72,0x34,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x30,0x5d,0x29,0x2e,0x73,0x30,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,
|
||||||
|
0x74,0x20,0x72,0x35,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x31,0x5d,0x29,0x2e,0x73,0x30,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,
|
||||||
|
0x6e,0x74,0x20,0x72,0x36,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x30,0x29,0x2e,0x73,0x30,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,
|
||||||
|
0x6e,0x74,0x20,0x72,0x37,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x31,0x29,0x2e,0x73,0x30,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,
|
||||||
|
0x6e,0x74,0x20,0x72,0x38,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x31,0x29,0x2e,0x73,0x32,0x3b,0x0d,0x58,0x4d,0x52,0x49,0x47,0x5f,0x49,0x4e,
|
||||||
|
0x43,0x4c,0x55,0x44,0x45,0x5f,0x52,0x41,0x4e,0x44,0x4f,0x4d,0x5f,0x4d,0x41,0x54,0x48,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x61,0x6c,
|
||||||
|
0x3d,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x30,0x5d,0x29,0x2e,0x73,0x30,0x5e,0x72,0x32,0x2c,0x61,0x73,
|
||||||
|
0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x30,0x5d,0x29,0x2e,0x73,0x31,0x5e,0x72,0x33,0x29,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,
|
||||||
|
0x20,0x61,0x68,0x3d,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x31,0x5d,0x29,0x2e,0x73,0x30,0x5e,0x72,0x30,
|
||||||
|
0x2c,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x31,0x5d,0x29,0x2e,0x73,0x31,0x5e,0x72,0x31,0x29,0x3b,0x0d,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x74,
|
||||||
|
0x3b,0x0d,0x74,0x2e,0x73,0x30,0x3d,0x6d,0x75,0x6c,0x5f,0x68,0x69,0x28,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x2c,0x61,0x73,
|
||||||
|
0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x74,0x6d,0x70,0x29,0x2e,0x73,0x30,0x29,0x3b,0x0d,0x74,0x2e,0x73,0x31,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,
|
||||||
|
0x28,0x63,0x29,0x2e,0x73,0x30,0x2a,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x74,0x6d,0x70,0x29,0x2e,0x73,0x30,0x3b,0x0d,0x7b,0x0d,0x63,0x6f,0x6e,0x73,
|
||||||
|
0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x31,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,
|
||||||
|
0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x29,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,
|
||||||
|
0x6e,0x6b,0x32,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,
|
||||||
|
0x29,0x29,0x3b,0x0d,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x33,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,
|
||||||
|
0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,0x29,0x29,0x3b,0x0d,0x63,0x20,0x5e,0x3d,0x20,0x61,0x73,0x5f,
|
||||||
|
0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x32,0x29,0x5e,0x61,
|
||||||
|
0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x29,0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,
|
||||||
|
0x4b,0x28,0x31,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x2b,0x62,0x78,0x31,0x29,0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,
|
||||||
|
0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x2b,0x62,
|
||||||
|
0x78,0x30,0x29,0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,
|
||||||
|
0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x32,0x2b,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x29,0x3b,0x0d,0x7d,0x0d,0x61,0x5b,
|
||||||
|
0x31,0x5d,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x28,0x61,0x68,0x29,0x2b,0x74,0x2e,0x73,0x31,0x3b,0x0d,0x61,0x5b,0x30,0x5d,0x3d,0x61,0x73,0x5f,0x75,0x6c,
|
||||||
|
0x6f,0x6e,0x67,0x28,0x61,0x6c,0x29,0x2b,0x74,0x2e,0x73,0x30,0x3b,0x0d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,
|
||||||
|
0x29,0x3d,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x3b,0x0d,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,
|
||||||
|
0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0d,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,
|
||||||
0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,
|
0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,
|
||||||
0x78,0x29,0x3d,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3b,0x0a,0x69,0x64,0x78,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,
|
0x78,0x29,0x3d,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3b,0x0d,0x23,0x65,0x6e,0x64,0x69,0x66,0x0d,0x28,0x28,0x75,0x69,
|
||||||
0x67,0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x26,0x30,0x78,0x31,0x46,0x46,0x46,0x43,0x30,0x3b,0x0a,0x69,0x64,0x78,0x31,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,
|
0x6e,0x74,0x34,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x74,0x6d,0x70,0x3b,0x0d,0x62,0x78,0x31,0x3d,0x62,0x78,0x30,0x3b,0x0d,0x62,0x78,0x30,
|
||||||
0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x26,0x30,0x78,0x33,0x30,0x3b,0x0a,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3d,0x2a,
|
0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x3b,0x0d,0x7d,0x0d,0x7d,0x0d,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,
|
||||||
0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,
|
0x5f,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0d,0x7d,0x0d,0x00
|
||||||
0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,0x78,0x29,0x3b,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x69,0x64,0x78,
|
|
||||||
0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x26,0x4d,0x41,0x53,0x4b,0x3b,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x75,0x69,
|
|
||||||
0x6e,0x74,0x34,0x20,0x74,0x6d,0x70,0x3d,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,0x29,0x3b,0x0a,0x74,0x6d,0x70,
|
|
||||||
0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x72,0x30,0x2b,0x72,0x31,0x3b,0x0a,0x74,0x6d,0x70,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x72,0x32,0x2b,0x72,0x33,0x3b,0x0a,0x63,
|
|
||||||
0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x34,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x30,0x5d,0x29,0x2e,0x73,0x30,0x3b,0x0a,
|
|
||||||
0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x35,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x31,0x5d,0x29,0x2e,0x73,0x30,0x3b,
|
|
||||||
0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x36,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x30,0x29,0x2e,0x73,0x30,0x3b,
|
|
||||||
0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x37,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x31,0x29,0x2e,0x73,0x30,0x3b,
|
|
||||||
0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x38,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x62,0x78,0x31,0x29,0x2e,0x73,0x32,0x3b,
|
|
||||||
0x0a,0x58,0x4d,0x52,0x49,0x47,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x52,0x41,0x4e,0x44,0x4f,0x4d,0x5f,0x4d,0x41,0x54,0x48,0x0a,0x63,0x6f,0x6e,0x73,0x74,
|
|
||||||
0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x61,0x6c,0x3d,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x30,0x5d,0x29,
|
|
||||||
0x2e,0x73,0x30,0x5e,0x72,0x32,0x2c,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x30,0x5d,0x29,0x2e,0x73,0x31,0x5e,0x72,0x33,0x29,0x3b,0x0a,0x63,0x6f,
|
|
||||||
0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x61,0x68,0x3d,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,
|
|
||||||
0x31,0x5d,0x29,0x2e,0x73,0x30,0x5e,0x72,0x30,0x2c,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x61,0x5b,0x31,0x5d,0x29,0x2e,0x73,0x31,0x5e,0x72,0x31,0x29,0x3b,
|
|
||||||
0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x74,0x3b,0x0a,0x74,0x2e,0x73,0x30,0x3d,0x6d,0x75,0x6c,0x5f,0x68,0x69,0x28,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,
|
|
||||||
0x28,0x63,0x29,0x2e,0x73,0x30,0x2c,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x74,0x6d,0x70,0x29,0x2e,0x73,0x30,0x29,0x3b,0x0a,0x74,0x2e,0x73,0x31,0x3d,
|
|
||||||
0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x2e,0x73,0x30,0x2a,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x74,0x6d,0x70,0x29,0x2e,0x73,
|
|
||||||
0x30,0x3b,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x31,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,
|
|
||||||
0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x29,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,
|
|
||||||
0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x32,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,
|
|
||||||
0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x29,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x63,0x68,0x75,0x6e,0x6b,0x33,
|
|
||||||
0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,0x29,0x29,0x3b,
|
|
||||||
0x0a,0x63,0x20,0x5e,0x3d,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,
|
|
||||||
0x63,0x68,0x75,0x6e,0x6b,0x32,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x29,0x3b,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,
|
|
||||||
0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x31,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x33,0x2b,0x62,0x78,
|
|
||||||
0x31,0x29,0x3b,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x32,0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,
|
|
||||||
0x28,0x63,0x68,0x75,0x6e,0x6b,0x31,0x2b,0x62,0x78,0x30,0x29,0x3b,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x33,
|
|
||||||
0x29,0x3d,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x63,0x68,0x75,0x6e,0x6b,0x32,0x2b,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x20,0x2a,0x29,0x61,0x29,0x5b,
|
|
||||||
0x30,0x5d,0x29,0x3b,0x0a,0x7d,0x0a,0x61,0x5b,0x31,0x5d,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x28,0x61,0x68,0x29,0x2b,0x74,0x2e,0x73,0x31,0x3b,0x0a,0x61,
|
|
||||||
0x5b,0x30,0x5d,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x28,0x61,0x6c,0x29,0x2b,0x74,0x2e,0x73,0x30,0x3b,0x0a,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,
|
|
||||||
0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x30,0x29,0x3d,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x3b,0x0a,0x23,0x69,0x66,0x64,
|
|
||||||
0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x2a,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,
|
|
||||||
0x75,0x69,0x6e,0x74,0x31,0x36,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x53,0x63,0x72,0x61,0x74,
|
|
||||||
0x63,0x68,0x70,0x61,0x64,0x29,0x2b,0x69,0x64,0x78,0x29,0x3d,0x2a,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x6c,0x69,0x6e,0x65,0x3b,0x0a,0x23,0x65,
|
|
||||||
0x6e,0x64,0x69,0x66,0x0a,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x61,0x29,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x74,0x6d,0x70,0x3b,0x0a,0x62,0x78,0x31,
|
|
||||||
0x3d,0x62,0x78,0x30,0x3b,0x0a,0x62,0x78,0x30,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x63,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x6d,0x65,0x6d,0x5f,
|
|
||||||
0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x7d,0x0a,0x00
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
#include "randomx_constants_wow.h"
|
#include "randomx_constants_wow.h"
|
||||||
#elif (ALGO == ALGO_RX_LOKI)
|
#elif (ALGO == ALGO_RX_LOKI)
|
||||||
#include "randomx_constants_loki.h"
|
#include "randomx_constants_loki.h"
|
||||||
|
#elif (ALGO == ALGO_RX_ARQMA)
|
||||||
|
#include "randomx_constants_arqma.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "aes.cl"
|
#include "aes.cl"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
96
src/backend/opencl/cl/rx/randomx_constants_arqma.h
Normal file
96
src/backend/opencl/cl/rx/randomx_constants_arqma.h
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2019 SChernykh
|
||||||
|
|
||||||
|
This file is part of RandomX OpenCL.
|
||||||
|
|
||||||
|
RandomX OpenCL is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
RandomX OpenCL is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with RandomX OpenCL. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Dataset base size in bytes. Must be a power of 2.
|
||||||
|
#define RANDOMX_DATASET_BASE_SIZE 2147483648
|
||||||
|
|
||||||
|
//Dataset extra size. Must be divisible by 64.
|
||||||
|
#define RANDOMX_DATASET_EXTRA_SIZE 33554368
|
||||||
|
|
||||||
|
//Scratchpad L3 size in bytes. Must be a power of 2.
|
||||||
|
#define RANDOMX_SCRATCHPAD_L3 262144
|
||||||
|
|
||||||
|
//Scratchpad L2 size in bytes. Must be a power of two and less than or equal to RANDOMX_SCRATCHPAD_L3.
|
||||||
|
#define RANDOMX_SCRATCHPAD_L2 131072
|
||||||
|
|
||||||
|
//Scratchpad L1 size in bytes. Must be a power of two (minimum 64) and less than or equal to RANDOMX_SCRATCHPAD_L2.
|
||||||
|
#define RANDOMX_SCRATCHPAD_L1 16384
|
||||||
|
|
||||||
|
//Jump condition mask size in bits.
|
||||||
|
#define RANDOMX_JUMP_BITS 8
|
||||||
|
|
||||||
|
//Jump condition mask offset in bits. The sum of RANDOMX_JUMP_BITS and RANDOMX_JUMP_OFFSET must not exceed 16.
|
||||||
|
#define RANDOMX_JUMP_OFFSET 8
|
||||||
|
|
||||||
|
//Integer instructions
|
||||||
|
#define RANDOMX_FREQ_IADD_RS 16
|
||||||
|
#define RANDOMX_FREQ_IADD_M 7
|
||||||
|
#define RANDOMX_FREQ_ISUB_R 16
|
||||||
|
#define RANDOMX_FREQ_ISUB_M 7
|
||||||
|
#define RANDOMX_FREQ_IMUL_R 16
|
||||||
|
#define RANDOMX_FREQ_IMUL_M 4
|
||||||
|
#define RANDOMX_FREQ_IMULH_R 4
|
||||||
|
#define RANDOMX_FREQ_IMULH_M 1
|
||||||
|
#define RANDOMX_FREQ_ISMULH_R 4
|
||||||
|
#define RANDOMX_FREQ_ISMULH_M 1
|
||||||
|
#define RANDOMX_FREQ_IMUL_RCP 8
|
||||||
|
#define RANDOMX_FREQ_INEG_R 2
|
||||||
|
#define RANDOMX_FREQ_IXOR_R 15
|
||||||
|
#define RANDOMX_FREQ_IXOR_M 5
|
||||||
|
#define RANDOMX_FREQ_IROR_R 8
|
||||||
|
#define RANDOMX_FREQ_IROL_R 2
|
||||||
|
#define RANDOMX_FREQ_ISWAP_R 4
|
||||||
|
|
||||||
|
//Floating point instructions
|
||||||
|
#define RANDOMX_FREQ_FSWAP_R 4
|
||||||
|
#define RANDOMX_FREQ_FADD_R 16
|
||||||
|
#define RANDOMX_FREQ_FADD_M 5
|
||||||
|
#define RANDOMX_FREQ_FSUB_R 16
|
||||||
|
#define RANDOMX_FREQ_FSUB_M 5
|
||||||
|
#define RANDOMX_FREQ_FSCAL_R 6
|
||||||
|
#define RANDOMX_FREQ_FMUL_R 32
|
||||||
|
#define RANDOMX_FREQ_FDIV_M 4
|
||||||
|
#define RANDOMX_FREQ_FSQRT_R 6
|
||||||
|
|
||||||
|
//Control instructions
|
||||||
|
#define RANDOMX_FREQ_CBRANCH 25
|
||||||
|
#define RANDOMX_FREQ_CFROUND 1
|
||||||
|
|
||||||
|
//Store instruction
|
||||||
|
#define RANDOMX_FREQ_ISTORE 16
|
||||||
|
|
||||||
|
//No-op instruction
|
||||||
|
#define RANDOMX_FREQ_NOP 0
|
||||||
|
|
||||||
|
#define RANDOMX_DATASET_ITEM_SIZE 64
|
||||||
|
|
||||||
|
#define RANDOMX_PROGRAM_SIZE 256
|
||||||
|
|
||||||
|
#define HASH_SIZE 64
|
||||||
|
#define ENTROPY_SIZE (128 + RANDOMX_PROGRAM_SIZE * 8)
|
||||||
|
#define REGISTERS_SIZE 256
|
||||||
|
#define IMM_BUF_SIZE (RANDOMX_PROGRAM_SIZE * 4 - REGISTERS_SIZE)
|
||||||
|
#define IMM_INDEX_COUNT ((IMM_BUF_SIZE / 4) - 2)
|
||||||
|
#define VM_STATE_SIZE (REGISTERS_SIZE + IMM_BUF_SIZE + RANDOMX_PROGRAM_SIZE * 4)
|
||||||
|
#define ROUNDING_MODE (RANDOMX_FREQ_CFROUND ? -1 : 0)
|
||||||
|
|
||||||
|
// Scratchpad L1/L2/L3 bits
|
||||||
|
#define LOC_L1 (32 - 14)
|
||||||
|
#define LOC_L2 (32 - 17)
|
||||||
|
#define LOC_L3 (32 - 18)
|
||||||
@@ -13,8 +13,8 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/OclBackend.h
|
src/backend/opencl/OclBackend.h
|
||||||
src/backend/opencl/OclCache.h
|
src/backend/opencl/OclCache.h
|
||||||
src/backend/opencl/OclConfig.h
|
src/backend/opencl/OclConfig.h
|
||||||
|
src/backend/opencl/OclConfig_gen.h
|
||||||
src/backend/opencl/OclGenerator.h
|
src/backend/opencl/OclGenerator.h
|
||||||
src/backend/opencl/OclInterleave.h
|
|
||||||
src/backend/opencl/OclLaunchData.h
|
src/backend/opencl/OclLaunchData.h
|
||||||
src/backend/opencl/OclThread.h
|
src/backend/opencl/OclThread.h
|
||||||
src/backend/opencl/OclThreads.h
|
src/backend/opencl/OclThreads.h
|
||||||
@@ -22,6 +22,8 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/runners/OclBaseRunner.h
|
src/backend/opencl/runners/OclBaseRunner.h
|
||||||
src/backend/opencl/runners/OclCnRunner.h
|
src/backend/opencl/runners/OclCnRunner.h
|
||||||
src/backend/opencl/runners/tools/OclCnR.h
|
src/backend/opencl/runners/tools/OclCnR.h
|
||||||
|
src/backend/opencl/runners/tools/OclSharedData.h
|
||||||
|
src/backend/opencl/runners/tools/OclSharedState.h
|
||||||
src/backend/opencl/wrappers/OclContext.h
|
src/backend/opencl/wrappers/OclContext.h
|
||||||
src/backend/opencl/wrappers/OclDevice.h
|
src/backend/opencl/wrappers/OclDevice.h
|
||||||
src/backend/opencl/wrappers/OclError.h
|
src/backend/opencl/wrappers/OclError.h
|
||||||
@@ -42,7 +44,6 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/OclBackend.cpp
|
src/backend/opencl/OclBackend.cpp
|
||||||
src/backend/opencl/OclCache.cpp
|
src/backend/opencl/OclCache.cpp
|
||||||
src/backend/opencl/OclConfig.cpp
|
src/backend/opencl/OclConfig.cpp
|
||||||
src/backend/opencl/OclInterleave.cpp
|
|
||||||
src/backend/opencl/OclLaunchData.cpp
|
src/backend/opencl/OclLaunchData.cpp
|
||||||
src/backend/opencl/OclThread.cpp
|
src/backend/opencl/OclThread.cpp
|
||||||
src/backend/opencl/OclThreads.cpp
|
src/backend/opencl/OclThreads.cpp
|
||||||
@@ -50,6 +51,8 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/runners/OclBaseRunner.cpp
|
src/backend/opencl/runners/OclBaseRunner.cpp
|
||||||
src/backend/opencl/runners/OclCnRunner.cpp
|
src/backend/opencl/runners/OclCnRunner.cpp
|
||||||
src/backend/opencl/runners/tools/OclCnR.cpp
|
src/backend/opencl/runners/tools/OclCnR.cpp
|
||||||
|
src/backend/opencl/runners/tools/OclSharedData.cpp
|
||||||
|
src/backend/opencl/runners/tools/OclSharedState.cpp
|
||||||
src/backend/opencl/wrappers/OclContext.cpp
|
src/backend/opencl/wrappers/OclContext.cpp
|
||||||
src/backend/opencl/wrappers/OclDevice.cpp
|
src/backend/opencl/wrappers/OclDevice.cpp
|
||||||
src/backend/opencl/wrappers/OclError.cpp
|
src/backend/opencl/wrappers/OclError.cpp
|
||||||
@@ -78,7 +81,6 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/runners/OclRxBaseRunner.h
|
src/backend/opencl/runners/OclRxBaseRunner.h
|
||||||
src/backend/opencl/runners/OclRxJitRunner.h
|
src/backend/opencl/runners/OclRxJitRunner.h
|
||||||
src/backend/opencl/runners/OclRxVmRunner.h
|
src/backend/opencl/runners/OclRxVmRunner.h
|
||||||
src/backend/opencl/runners/tools/OclRxDataset.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND SOURCES_BACKEND_OPENCL
|
list(APPEND SOURCES_BACKEND_OPENCL
|
||||||
@@ -95,7 +97,6 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/runners/OclRxBaseRunner.cpp
|
src/backend/opencl/runners/OclRxBaseRunner.cpp
|
||||||
src/backend/opencl/runners/OclRxJitRunner.cpp
|
src/backend/opencl/runners/OclRxJitRunner.cpp
|
||||||
src/backend/opencl/runners/OclRxVmRunner.cpp
|
src/backend/opencl/runners/OclRxVmRunner.cpp
|
||||||
src/backend/opencl/runners/tools/OclRxDataset.cpp
|
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -23,10 +23,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/opencl/runners/OclBaseRunner.h"
|
||||||
#include "backend/opencl/cl/OclSource.h"
|
#include "backend/opencl/cl/OclSource.h"
|
||||||
#include "backend/opencl/OclCache.h"
|
#include "backend/opencl/OclCache.h"
|
||||||
#include "backend/opencl/OclLaunchData.h"
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
#include "backend/opencl/runners/OclBaseRunner.h"
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
#include "backend/opencl/wrappers/OclError.h"
|
#include "backend/opencl/wrappers/OclError.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
@@ -34,6 +35,9 @@
|
|||||||
#include "crypto/common/VirtualMemory.h"
|
#include "crypto/common/VirtualMemory.h"
|
||||||
|
|
||||||
|
|
||||||
|
constexpr size_t oneGiB = 1024 * 1024 * 1024;
|
||||||
|
|
||||||
|
|
||||||
xmrig::OclBaseRunner::OclBaseRunner(size_t id, const OclLaunchData &data) :
|
xmrig::OclBaseRunner::OclBaseRunner(size_t id, const OclLaunchData &data) :
|
||||||
m_algorithm(data.algorithm),
|
m_algorithm(data.algorithm),
|
||||||
m_ctx(data.ctx),
|
m_ctx(data.ctx),
|
||||||
@@ -95,14 +99,15 @@ void xmrig::OclBaseRunner::init()
|
|||||||
{
|
{
|
||||||
m_queue = OclLib::createCommandQueue(m_ctx, data().device.id());
|
m_queue = OclLib::createCommandQueue(m_ctx, data().device.id());
|
||||||
|
|
||||||
constexpr size_t oneGiB = 1024 * 1024 * 1024;
|
size_t size = align(bufferSize());
|
||||||
size_t size = bufferSize();
|
|
||||||
|
|
||||||
if (size < oneGiB && data().device.vendorId() == OCL_VENDOR_AMD && data().device.freeMemSize() >= oneGiB) {
|
if (size < oneGiB && data().device.vendorId() == OCL_VENDOR_AMD && data().device.freeMemSize() >= oneGiB) {
|
||||||
size = oneGiB;
|
m_buffer = OclSharedState::get(data().device.index()).createBuffer(m_ctx, size, m_offset);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_buffer = OclLib::createBuffer(m_ctx, CL_MEM_READ_WRITE, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_buffer = OclLib::createBuffer(m_ctx, CL_MEM_READ_WRITE, size);
|
|
||||||
m_input = createSubBuffer(CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY, Job::kMaxBlobSize);
|
m_input = createSubBuffer(CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY, Job::kMaxBlobSize);
|
||||||
m_output = createSubBuffer(CL_MEM_READ_WRITE, sizeof(cl_uint) * 0x100);
|
m_output = createSubBuffer(CL_MEM_READ_WRITE, sizeof(cl_uint) * 0x100);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "backend/opencl/kernels/rx/FindSharesKernel.h"
|
#include "backend/opencl/kernels/rx/FindSharesKernel.h"
|
||||||
#include "backend/opencl/kernels/rx/HashAesKernel.h"
|
#include "backend/opencl/kernels/rx/HashAesKernel.h"
|
||||||
#include "backend/opencl/OclLaunchData.h"
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
#include "base/net/stratum/Job.h"
|
#include "base/net/stratum/Job.h"
|
||||||
#include "crypto/rx/Rx.h"
|
#include "crypto/rx/Rx.h"
|
||||||
@@ -75,6 +76,7 @@ xmrig::OclRxBaseRunner::~OclRxBaseRunner()
|
|||||||
OclLib::release(m_hashes);
|
OclLib::release(m_hashes);
|
||||||
OclLib::release(m_rounding);
|
OclLib::release(m_rounding);
|
||||||
OclLib::release(m_scratchpads);
|
OclLib::release(m_scratchpads);
|
||||||
|
OclLib::release(m_dataset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -120,7 +122,7 @@ void xmrig::OclRxBaseRunner::set(const Job &job, uint8_t *blob)
|
|||||||
m_seed = job.seed();
|
m_seed = job.seed();
|
||||||
|
|
||||||
auto dataset = Rx::dataset(job, 0);
|
auto dataset = Rx::dataset(job, 0);
|
||||||
enqueueWriteBuffer(data().dataset->get(), CL_TRUE, 0, dataset->size(), dataset->raw());
|
enqueueWriteBuffer(m_dataset, CL_TRUE, 0, RxDataset::maxSize(), dataset->raw());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (job.size() < Job::kMaxBlobSize) {
|
if (job.size() < Job::kMaxBlobSize) {
|
||||||
@@ -177,4 +179,5 @@ void xmrig::OclRxBaseRunner::init()
|
|||||||
m_hashes = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, 64 * m_intensity);
|
m_hashes = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, 64 * m_intensity);
|
||||||
m_entropy = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, (128 + 2560) * m_intensity);
|
m_entropy = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, (128 + 2560) * m_intensity);
|
||||||
m_rounding = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, sizeof(uint32_t) * m_intensity);
|
m_rounding = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, sizeof(uint32_t) * m_intensity);
|
||||||
|
m_dataset = OclSharedState::get(data().device.index()).dataset();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ protected:
|
|||||||
Blake2bHashRegistersKernel *m_blake2b_hash_registers_64 = nullptr;
|
Blake2bHashRegistersKernel *m_blake2b_hash_registers_64 = nullptr;
|
||||||
Blake2bInitialHashKernel *m_blake2b_initial_hash = nullptr;
|
Blake2bInitialHashKernel *m_blake2b_initial_hash = nullptr;
|
||||||
Buffer m_seed;
|
Buffer m_seed;
|
||||||
|
cl_mem m_dataset = nullptr;
|
||||||
cl_mem m_entropy = nullptr;
|
cl_mem m_entropy = nullptr;
|
||||||
cl_mem m_hashes = nullptr;
|
cl_mem m_hashes = nullptr;
|
||||||
cl_mem m_rounding = nullptr;
|
cl_mem m_rounding = nullptr;
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ void xmrig::OclRxJitRunner::build()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_randomx_run = new RxRunKernel(m_asmProgram);
|
m_randomx_run = new RxRunKernel(m_asmProgram);
|
||||||
m_randomx_run->setArgs(data().dataset->get(), m_scratchpads, m_registers, m_rounding, m_programs, m_intensity, m_algorithm);
|
m_randomx_run->setArgs(m_dataset, m_scratchpads, m_registers, m_rounding, m_programs, m_intensity, m_algorithm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ void xmrig::OclRxVmRunner::build()
|
|||||||
m_init_vm->setArgs(m_entropy, m_vm_states, m_rounding);
|
m_init_vm->setArgs(m_entropy, m_vm_states, m_rounding);
|
||||||
|
|
||||||
m_execute_vm = new ExecuteVmKernel(m_program);
|
m_execute_vm = new ExecuteVmKernel(m_program);
|
||||||
m_execute_vm->setArgs(m_vm_states, m_rounding, m_scratchpads, data().dataset->get(), m_intensity);
|
m_execute_vm->setArgs(m_vm_states, m_rounding, m_scratchpads, m_dataset, m_intensity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,17 +23,44 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/OclInterleave.h"
|
#include "backend/opencl/runners/tools/OclSharedData.h"
|
||||||
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
|
#include "crypto/rx/Rx.h"
|
||||||
|
#include "crypto/rx/RxDataset.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
#include <stdexcept>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
|
||||||
uint64_t xmrig::OclInterleave::adjustDelay(size_t id)
|
constexpr size_t oneGiB = 1024 * 1024 * 1024;
|
||||||
|
|
||||||
|
|
||||||
|
cl_mem xmrig::OclSharedData::createBuffer(cl_context context, size_t size, size_t &offset)
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
offset += size * m_offset++;
|
||||||
|
size = std::max(size * m_threads, oneGiB);
|
||||||
|
|
||||||
|
if (!m_buffer) {
|
||||||
|
m_buffer = OclLib::createBuffer(context, CL_MEM_READ_WRITE, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return OclLib::retain(m_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t xmrig::OclSharedData::adjustDelay(size_t id)
|
||||||
|
{
|
||||||
|
if (m_threads < 2) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const uint64_t t0 = Chrono::steadyMSecs();
|
const uint64_t t0 = Chrono::steadyMSecs();
|
||||||
uint64_t delay = 0;
|
uint64_t delay = 0;
|
||||||
|
|
||||||
@@ -69,8 +96,12 @@ uint64_t xmrig::OclInterleave::adjustDelay(size_t id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint64_t xmrig::OclInterleave::resumeDelay(size_t id)
|
uint64_t xmrig::OclSharedData::resumeDelay(size_t id)
|
||||||
{
|
{
|
||||||
|
if (m_threads < 2) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t delay = 0;
|
uint64_t delay = 0;
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -99,14 +130,28 @@ uint64_t xmrig::OclInterleave::resumeDelay(size_t id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclInterleave::setResumeCounter(uint32_t value)
|
void xmrig::OclSharedData::release()
|
||||||
{
|
{
|
||||||
|
OclLib::release(m_buffer);
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
OclLib::release(m_dataset);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclSharedData::setResumeCounter(uint32_t value)
|
||||||
|
{
|
||||||
|
if (m_threads < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(m_mutex);
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
m_resumeCounter = value;
|
m_resumeCounter = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclInterleave::setRunTime(uint64_t time)
|
void xmrig::OclSharedData::setRunTime(uint64_t time)
|
||||||
{
|
{
|
||||||
// averagingBias = 1.0 - only the last delta time is taken into account
|
// averagingBias = 1.0 - only the last delta time is taken into account
|
||||||
// averagingBias = 0.5 - the last delta time has the same weight as all the previous ones combined
|
// averagingBias = 0.5 - the last delta time has the same weight as all the previous ones combined
|
||||||
@@ -116,3 +161,34 @@ void xmrig::OclInterleave::setRunTime(uint64_t time)
|
|||||||
std::lock_guard<std::mutex> lock(m_mutex);
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
m_averageRunTime = m_averageRunTime * (1.0 - averagingBias) + time * averagingBias;
|
m_averageRunTime = m_averageRunTime * (1.0 - averagingBias) + time * averagingBias;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
cl_mem xmrig::OclSharedData::dataset() const
|
||||||
|
{
|
||||||
|
if (!m_dataset) {
|
||||||
|
throw std::runtime_error("RandomX dataset is not available");
|
||||||
|
}
|
||||||
|
|
||||||
|
return OclLib::retain(m_dataset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclSharedData::createDataset(cl_context ctx, const Job &job, bool host)
|
||||||
|
{
|
||||||
|
if (m_dataset) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_int ret;
|
||||||
|
|
||||||
|
if (host) {
|
||||||
|
auto dataset = Rx::dataset(job, 0);
|
||||||
|
|
||||||
|
m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, RxDataset::maxSize(), dataset->raw(), &ret);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY, RxDataset::maxSize(), nullptr, &ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -22,42 +22,62 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_OCLINTERLEAVE_H
|
#ifndef XMRIG_OCLSHAREDDATA_H
|
||||||
#define XMRIG_OCLINTERLEAVE_H
|
#define XMRIG_OCLSHAREDDATA_H
|
||||||
|
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
|
|
||||||
|
using cl_context = struct _cl_context *;
|
||||||
|
using cl_mem = struct _cl_mem *;
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class OclInterleave
|
class Job;
|
||||||
|
|
||||||
|
|
||||||
|
class OclSharedData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OclInterleave() = delete;
|
OclSharedData() = default;
|
||||||
inline OclInterleave(size_t threads) : m_threads(threads) {}
|
|
||||||
|
|
||||||
|
cl_mem createBuffer(cl_context context, size_t size, size_t &offset);
|
||||||
uint64_t adjustDelay(size_t id);
|
uint64_t adjustDelay(size_t id);
|
||||||
uint64_t resumeDelay(size_t id);
|
uint64_t resumeDelay(size_t id);
|
||||||
|
void release();
|
||||||
void setResumeCounter(uint32_t value);
|
void setResumeCounter(uint32_t value);
|
||||||
void setRunTime(uint64_t time);
|
void setRunTime(uint64_t time);
|
||||||
|
|
||||||
|
inline size_t threads() const { return m_threads; }
|
||||||
|
|
||||||
|
inline OclSharedData &operator++() { ++m_threads; return *this; }
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
cl_mem dataset() const;
|
||||||
|
void createDataset(cl_context ctx, const Job &job, bool host);
|
||||||
|
# endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const size_t m_threads;
|
cl_mem m_buffer = nullptr;
|
||||||
double m_averageRunTime = 0.0;
|
double m_averageRunTime = 0.0;
|
||||||
double m_threshold = 0.95;
|
double m_threshold = 0.95;
|
||||||
|
size_t m_offset = 0;
|
||||||
|
size_t m_threads = 0;
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
uint32_t m_resumeCounter = 0;
|
uint32_t m_resumeCounter = 0;
|
||||||
uint64_t m_timestamp = 0;
|
uint64_t m_timestamp = 0;
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
cl_mem m_dataset = nullptr;
|
||||||
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
using OclInterleavePtr = std::shared_ptr<OclInterleave>;
|
|
||||||
|
|
||||||
|
|
||||||
} /* namespace xmrig */
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_OCLINTERLEAVE_H */
|
#endif /* XMRIG_OCLSHAREDDATA_H */
|
||||||
74
src/backend/opencl/runners/tools/OclSharedState.cpp
Normal file
74
src/backend/opencl/runners/tools/OclSharedState.cpp
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedData.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
static std::map<uint32_t, OclSharedData> map;
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::OclSharedData &xmrig::OclSharedState::get(uint32_t index)
|
||||||
|
{
|
||||||
|
return map[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclSharedState::release()
|
||||||
|
{
|
||||||
|
for (auto &kv : map) {
|
||||||
|
kv.second.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
map.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclSharedState::start(const std::vector<OclLaunchData> &threads, const Job &job)
|
||||||
|
{
|
||||||
|
assert(map.empty());
|
||||||
|
|
||||||
|
for (const auto &data : threads) {
|
||||||
|
auto &sharedData = map[data.device.index()];
|
||||||
|
|
||||||
|
++sharedData;
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
if (data.algorithm.family() == Algorithm::RANDOM_X) {
|
||||||
|
sharedData.createDataset(data.ctx, job, data.thread.isDatasetHost());
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
}
|
||||||
47
src/backend/opencl/runners/tools/OclSharedState.h
Normal file
47
src/backend/opencl/runners/tools/OclSharedState.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_OCLSHAREDSTATE_H
|
||||||
|
#define XMRIG_OCLSHAREDSTATE_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class OclSharedState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static OclSharedData &get(uint32_t index);
|
||||||
|
static void release();
|
||||||
|
static void start(const std::vector<OclLaunchData> &threads, const Job &job);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_OCLSHAREDSTATE_H */
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/wrappers/OclContext.h"
|
#include "backend/opencl/wrappers/OclContext.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -42,7 +43,7 @@ xmrig::OclContext::~OclContext()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::OclContext::init(const std::vector<OclDevice> &devices, std::vector<OclLaunchData> &threads, const Job &job)
|
bool xmrig::OclContext::init(const std::vector<OclDevice> &devices, std::vector<OclLaunchData> &threads)
|
||||||
{
|
{
|
||||||
if (!m_ctx) {
|
if (!m_ctx) {
|
||||||
std::vector<cl_device_id> ids(devices.size());
|
std::vector<cl_device_id> ids(devices.size());
|
||||||
@@ -59,12 +60,6 @@ bool xmrig::OclContext::init(const std::vector<OclDevice> &devices, std::vector<
|
|||||||
|
|
||||||
for (OclLaunchData &data : threads) {
|
for (OclLaunchData &data : threads) {
|
||||||
data.ctx = m_ctx;
|
data.ctx = m_ctx;
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
if (data.algorithm.family() == Algorithm::RANDOM_X) {
|
|
||||||
data.dataset->createBuffer(m_ctx, job, data.thread.isDatasetHost());
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public:
|
|||||||
OclContext(const OclDevice &device);
|
OclContext(const OclDevice &device);
|
||||||
~OclContext();
|
~OclContext();
|
||||||
|
|
||||||
bool init(const std::vector<OclDevice> &devices, std::vector<OclLaunchData> &threads, const Job &job);
|
bool init(const std::vector<OclDevice> &devices, std::vector<OclLaunchData> &threads);
|
||||||
|
|
||||||
inline bool isValid() const { return m_ctx != nullptr; }
|
inline bool isValid() const { return m_ctx != nullptr; }
|
||||||
inline cl_context ctx() const { return m_ctx; }
|
inline cl_context ctx() const { return m_ctx; }
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ extern bool ocl_vega_cn_generator(const OclDevice &device, const Algorithm &algo
|
|||||||
extern bool ocl_generic_cn_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
extern bool ocl_generic_cn_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
||||||
|
|
||||||
|
|
||||||
ocl_gen_config_fun generators[] = {
|
static ocl_gen_config_fun generators[] = {
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
ocl_generic_rx_generator,
|
ocl_generic_rx_generator,
|
||||||
# endif
|
# endif
|
||||||
@@ -215,6 +215,6 @@ void xmrig::OclDevice::toJSON(rapidjson::Value &out, rapidjson::Document &doc) c
|
|||||||
out.AddMember("name", name().toJSON(doc), allocator);
|
out.AddMember("name", name().toJSON(doc), allocator);
|
||||||
out.AddMember("bus_id", topology().toString().toJSON(doc), allocator);
|
out.AddMember("bus_id", topology().toString().toJSON(doc), allocator);
|
||||||
out.AddMember("cu", computeUnits(), allocator);
|
out.AddMember("cu", computeUnits(), allocator);
|
||||||
out.AddMember("global_mem", globalMemSize(), allocator);
|
out.AddMember("global_mem", static_cast<uint64_t>(globalMemSize()), allocator);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ static const char *kReleaseDevice = "clReleaseDevice";
|
|||||||
static const char *kReleaseKernel = "clReleaseKernel";
|
static const char *kReleaseKernel = "clReleaseKernel";
|
||||||
static const char *kReleaseMemObject = "clReleaseMemObject";
|
static const char *kReleaseMemObject = "clReleaseMemObject";
|
||||||
static const char *kReleaseProgram = "clReleaseProgram";
|
static const char *kReleaseProgram = "clReleaseProgram";
|
||||||
|
static const char *kRetainMemObject = "clRetainMemObject";
|
||||||
static const char *kRetainProgram = "clRetainProgram";
|
static const char *kRetainProgram = "clRetainProgram";
|
||||||
static const char *kSetKernelArg = "clSetKernelArg";
|
static const char *kSetKernelArg = "clSetKernelArg";
|
||||||
static const char *kSetMemObjectDestructorCallback = "clSetMemObjectDestructorCallback";
|
static const char *kSetMemObjectDestructorCallback = "clSetMemObjectDestructorCallback";
|
||||||
@@ -106,6 +107,7 @@ typedef cl_int (CL_API_CALL *releaseDevice_t)(cl_device_id device);
|
|||||||
typedef cl_int (CL_API_CALL *releaseKernel_t)(cl_kernel);
|
typedef cl_int (CL_API_CALL *releaseKernel_t)(cl_kernel);
|
||||||
typedef cl_int (CL_API_CALL *releaseMemObject_t)(cl_mem);
|
typedef cl_int (CL_API_CALL *releaseMemObject_t)(cl_mem);
|
||||||
typedef cl_int (CL_API_CALL *releaseProgram_t)(cl_program);
|
typedef cl_int (CL_API_CALL *releaseProgram_t)(cl_program);
|
||||||
|
typedef cl_int (CL_API_CALL *retainMemObject_t)(cl_mem);
|
||||||
typedef cl_int (CL_API_CALL *retainProgram_t)(cl_program);
|
typedef cl_int (CL_API_CALL *retainProgram_t)(cl_program);
|
||||||
typedef cl_int (CL_API_CALL *setKernelArg_t)(cl_kernel, cl_uint, size_t, const void *);
|
typedef cl_int (CL_API_CALL *setKernelArg_t)(cl_kernel, cl_uint, size_t, const void *);
|
||||||
typedef cl_int (CL_API_CALL *setMemObjectDestructorCallback_t)(cl_mem, void (CL_CALLBACK *)(cl_mem, void *), void *);
|
typedef cl_int (CL_API_CALL *setMemObjectDestructorCallback_t)(cl_mem, void (CL_CALLBACK *)(cl_mem, void *), void *);
|
||||||
@@ -148,6 +150,7 @@ static releaseDevice_t pReleaseDevice = nu
|
|||||||
static releaseKernel_t pReleaseKernel = nullptr;
|
static releaseKernel_t pReleaseKernel = nullptr;
|
||||||
static releaseMemObject_t pReleaseMemObject = nullptr;
|
static releaseMemObject_t pReleaseMemObject = nullptr;
|
||||||
static releaseProgram_t pReleaseProgram = nullptr;
|
static releaseProgram_t pReleaseProgram = nullptr;
|
||||||
|
static retainMemObject_t pRetainMemObject = nullptr;
|
||||||
static retainProgram_t pRetainProgram = nullptr;
|
static retainProgram_t pRetainProgram = nullptr;
|
||||||
static setKernelArg_t pSetKernelArg = nullptr;
|
static setKernelArg_t pSetKernelArg = nullptr;
|
||||||
static setMemObjectDestructorCallback_t pSetMemObjectDestructorCallback = nullptr;
|
static setMemObjectDestructorCallback_t pSetMemObjectDestructorCallback = nullptr;
|
||||||
@@ -239,6 +242,7 @@ bool xmrig::OclLib::load()
|
|||||||
DLSYM(SetMemObjectDestructorCallback);
|
DLSYM(SetMemObjectDestructorCallback);
|
||||||
DLSYM(CreateSubBuffer);
|
DLSYM(CreateSubBuffer);
|
||||||
DLSYM(RetainProgram);
|
DLSYM(RetainProgram);
|
||||||
|
DLSYM(RetainMemObject);
|
||||||
|
|
||||||
# if defined(CL_VERSION_2_0)
|
# if defined(CL_VERSION_2_0)
|
||||||
uv_dlsym(&oclLib, kCreateCommandQueueWithProperties, reinterpret_cast<void**>(&pCreateCommandQueueWithProperties));
|
uv_dlsym(&oclLib, kCreateCommandQueueWithProperties, reinterpret_cast<void**>(&pCreateCommandQueueWithProperties));
|
||||||
@@ -670,6 +674,18 @@ cl_mem xmrig::OclLib::createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cl_mem xmrig::OclLib::retain(cl_mem memobj) noexcept
|
||||||
|
{
|
||||||
|
assert(pRetainMemObject != nullptr);
|
||||||
|
|
||||||
|
if (memobj != nullptr) {
|
||||||
|
pRetainMemObject(memobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return memobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
cl_program xmrig::OclLib::createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept
|
cl_program xmrig::OclLib::createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept
|
||||||
{
|
{
|
||||||
assert(pCreateProgramWithBinary != nullptr);
|
assert(pCreateProgramWithBinary != nullptr);
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ public:
|
|||||||
static cl_mem createBuffer(cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret) noexcept;
|
static cl_mem createBuffer(cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret) noexcept;
|
||||||
static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size, cl_int *errcode_ret) noexcept;
|
static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size, cl_int *errcode_ret) noexcept;
|
||||||
static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size);
|
static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size);
|
||||||
|
static cl_mem retain(cl_mem memobj) noexcept;
|
||||||
static cl_program createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept;
|
static cl_program createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept;
|
||||||
static cl_program createProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret) noexcept;
|
static cl_program createProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret) noexcept;
|
||||||
static cl_program retain(cl_program program) noexcept;
|
static cl_program retain(cl_program program) noexcept;
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ rapidjson::Value xmrig::OclPlatform::toJSON(rapidjson::Document &doc) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
Value out(kObjectType);
|
Value out(kObjectType);
|
||||||
out.AddMember("index", index(), allocator);
|
out.AddMember("index", static_cast<uint64_t>(index()), allocator);
|
||||||
out.AddMember("profile", profile().toJSON(doc), allocator);
|
out.AddMember("profile", profile().toJSON(doc), allocator);
|
||||||
out.AddMember("version", version().toJSON(doc), allocator);
|
out.AddMember("version", version().toJSON(doc), allocator);
|
||||||
out.AddMember("name", name().toJSON(doc), allocator);
|
out.AddMember("name", name().toJSON(doc), allocator);
|
||||||
|
|||||||
@@ -98,7 +98,14 @@ elseif (APPLE)
|
|||||||
else()
|
else()
|
||||||
set(SOURCES_OS
|
set(SOURCES_OS
|
||||||
src/base/io/json/Json_unix.cpp
|
src/base/io/json/Json_unix.cpp
|
||||||
src/base/kernel//Platform_unix.cpp
|
src/base/kernel/Platform_unix.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (WITH_HWLOC)
|
||||||
|
list(APPEND SOURCES_OS
|
||||||
|
src/base/kernel/Platform_hwloc.cpp
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -31,10 +31,10 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <time.h>
|
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -42,6 +42,7 @@
|
|||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/kernel/interfaces/ILogBackend.h"
|
#include "base/kernel/interfaces/ILogBackend.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
|
#include "base/tools/Object.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
@@ -67,10 +68,10 @@ static const char *colors_map[] = {
|
|||||||
class LogPrivate
|
class LogPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline LogPrivate() :
|
XMRIG_DISABLE_COPY_MOVE(LogPrivate)
|
||||||
m_buf()
|
|
||||||
{
|
|
||||||
}
|
LogPrivate() = default;
|
||||||
|
|
||||||
|
|
||||||
inline ~LogPrivate()
|
inline ~LogPrivate()
|
||||||
@@ -134,7 +135,7 @@ private:
|
|||||||
|
|
||||||
const uint64_t ms = Chrono::currentMSecsSinceEpoch();
|
const uint64_t ms = Chrono::currentMSecsSinceEpoch();
|
||||||
time_t now = ms / 1000;
|
time_t now = ms / 1000;
|
||||||
tm stime;
|
tm stime{};
|
||||||
|
|
||||||
# ifdef _WIN32
|
# ifdef _WIN32
|
||||||
localtime_s(&stime, &now);
|
localtime_s(&stime, &now);
|
||||||
@@ -188,7 +189,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char m_buf[4096];
|
char m_buf[4096]{};
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
std::vector<ILogBackend*> m_backends;
|
std::vector<ILogBackend*> m_backends;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ xmrig::ConsoleLog::ConsoleLog()
|
|||||||
}
|
}
|
||||||
|
|
||||||
uv_tty_set_mode(m_tty, UV_TTY_MODE_NORMAL);
|
uv_tty_set_mode(m_tty, UV_TTY_MODE_NORMAL);
|
||||||
m_stream = reinterpret_cast<uv_stream_t*>(m_tty);
|
|
||||||
|
|
||||||
# ifdef WIN32
|
# ifdef WIN32
|
||||||
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
|
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
@@ -68,25 +67,14 @@ xmrig::ConsoleLog::~ConsoleLog()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::ConsoleLog::print(int, const char *line, size_t, size_t size, bool colors)
|
void xmrig::ConsoleLog::print(int, const char *line, size_t, size_t, bool colors)
|
||||||
{
|
{
|
||||||
if (!m_tty || Log::colors != colors) {
|
if (!m_tty || Log::colors != colors) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef _WIN32
|
|
||||||
uv_buf_t buf = uv_buf_init(const_cast<char *>(line), static_cast<unsigned int>(size));
|
|
||||||
# else
|
|
||||||
uv_buf_t buf = uv_buf_init(const_cast<char *>(line), size);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
if (!isWritable()) {
|
|
||||||
fputs(line, stdout);
|
fputs(line, stdout);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
|
||||||
else {
|
|
||||||
uv_try_write(m_stream, &buf, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -95,13 +83,3 @@ bool xmrig::ConsoleLog::isSupported() const
|
|||||||
const uv_handle_type type = uv_guess_handle(1);
|
const uv_handle_type type = uv_guess_handle(1);
|
||||||
return type == UV_TTY || type == UV_NAMED_PIPE;
|
return type == UV_TTY || type == UV_NAMED_PIPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::ConsoleLog::isWritable() const
|
|
||||||
{
|
|
||||||
if (!m_stream || uv_is_writable(m_stream) != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isSupported();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -51,9 +51,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool isSupported() const;
|
bool isSupported() const;
|
||||||
bool isWritable() const;
|
|
||||||
|
|
||||||
uv_stream_t *m_stream = nullptr;
|
|
||||||
uv_tty_t *m_tty = nullptr;
|
uv_tty_t *m_tty = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include "base/kernel/Platform.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -33,13 +36,14 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "Platform.h"
|
namespace xmrig {
|
||||||
|
|
||||||
|
String Platform::m_userAgent;
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
xmrig::String Platform::m_userAgent;
|
void xmrig::Platform::init(const char *userAgent)
|
||||||
|
|
||||||
|
|
||||||
void Platform::init(const char *userAgent)
|
|
||||||
{
|
{
|
||||||
# ifdef XMRIG_FEATURE_TLS
|
# ifdef XMRIG_FEATURE_TLS
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
|
|||||||
@@ -26,12 +26,15 @@
|
|||||||
#define XMRIG_PLATFORM_H
|
#define XMRIG_PLATFORM_H
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Platform
|
class Platform
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -56,8 +59,11 @@ public:
|
|||||||
private:
|
private:
|
||||||
static char *createUserAgent();
|
static char *createUserAgent();
|
||||||
|
|
||||||
static xmrig::String m_userAgent;
|
static String m_userAgent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_PLATFORM_H */
|
#endif /* XMRIG_PLATFORM_H */
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
@@ -23,32 +24,26 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/runners/tools/OclRxDataset.h"
|
#include "base/kernel/Platform.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/cpu/platform/HwlocCpuInfo.h"
|
||||||
#include "crypto/rx/Rx.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "crypto/rx/RxDataset.h"
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclRxDataset::createBuffer(cl_context ctx, const Job &job, bool host)
|
#include <hwloc.h>
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::Platform::setThreadAffinity(uint64_t cpu_id)
|
||||||
{
|
{
|
||||||
if (m_dataset) {
|
auto cpu = static_cast<HwlocCpuInfo *>(Cpu::info());
|
||||||
return;
|
hwloc_obj_t pu = hwloc_get_pu_obj_by_os_index(cpu->topology(), static_cast<unsigned>(cpu_id));
|
||||||
|
|
||||||
|
if (pu == nullptr) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cl_int ret;
|
if (hwloc_set_cpubind(cpu->topology(), pu->cpuset, HWLOC_CPUBIND_THREAD | HWLOC_CPUBIND_STRICT) >= 0) {
|
||||||
|
return true;
|
||||||
if (host) {
|
|
||||||
auto dataset = Rx::dataset(job, 0);
|
|
||||||
|
|
||||||
m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, RxDataset::maxSize(), dataset->raw(), &ret);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY, RxDataset::maxSize(), nullptr, &ret);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return hwloc_set_cpubind(cpu->topology(), pu->cpuset, HWLOC_CPUBIND_THREAD) >= 0;
|
||||||
|
|
||||||
xmrig::OclRxDataset::~OclRxDataset()
|
|
||||||
{
|
|
||||||
OclLib::release(m_dataset);
|
|
||||||
}
|
}
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
#include "Platform.h"
|
#include "base/kernel/Platform.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#ifdef XMRIG_NVIDIA_PROJECT
|
#ifdef XMRIG_NVIDIA_PROJECT
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
char *Platform::createUserAgent()
|
char *xmrig::Platform::createUserAgent()
|
||||||
{
|
{
|
||||||
constexpr const size_t max = 256;
|
constexpr const size_t max = 256;
|
||||||
|
|
||||||
@@ -60,7 +60,8 @@ char *Platform::createUserAgent()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Platform::setThreadAffinity(uint64_t cpu_id)
|
#ifndef XMRIG_FEATURE_HWLOC
|
||||||
|
bool xmrig::Platform::setThreadAffinity(uint64_t cpu_id)
|
||||||
{
|
{
|
||||||
thread_port_t mach_thread;
|
thread_port_t mach_thread;
|
||||||
thread_affinity_policy_data_t policy = { static_cast<integer_t>(cpu_id) };
|
thread_affinity_policy_data_t policy = { static_cast<integer_t>(cpu_id) };
|
||||||
@@ -68,25 +69,26 @@ bool Platform::setThreadAffinity(uint64_t cpu_id)
|
|||||||
|
|
||||||
return thread_policy_set(mach_thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1) == KERN_SUCCESS;
|
return thread_policy_set(mach_thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1) == KERN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
uint32_t Platform::setTimerResolution(uint32_t resolution)
|
uint32_t xmrig::Platform::setTimerResolution(uint32_t resolution)
|
||||||
{
|
{
|
||||||
return resolution;
|
return resolution;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::restoreTimerResolution()
|
void xmrig::Platform::restoreTimerResolution()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::setProcessPriority(int priority)
|
void xmrig::Platform::setProcessPriority(int priority)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::setThreadPriority(int priority)
|
void xmrig::Platform::setThreadPriority(int priority)
|
||||||
{
|
{
|
||||||
if (priority == -1) {
|
if (priority == -1) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
#include "Platform.h"
|
#include "base/kernel/Platform.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#ifdef XMRIG_NVIDIA_PROJECT
|
#ifdef XMRIG_NVIDIA_PROJECT
|
||||||
@@ -52,7 +52,7 @@ typedef cpuset_t cpu_set_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
char *Platform::createUserAgent()
|
char *xmrig::Platform::createUserAgent()
|
||||||
{
|
{
|
||||||
constexpr const size_t max = 256;
|
constexpr const size_t max = 256;
|
||||||
|
|
||||||
@@ -84,7 +84,8 @@ char *Platform::createUserAgent()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Platform::setThreadAffinity(uint64_t cpu_id)
|
#ifndef XMRIG_FEATURE_HWLOC
|
||||||
|
bool xmrig::Platform::setThreadAffinity(uint64_t cpu_id)
|
||||||
{
|
{
|
||||||
cpu_set_t mn;
|
cpu_set_t mn;
|
||||||
CPU_ZERO(&mn);
|
CPU_ZERO(&mn);
|
||||||
@@ -96,25 +97,26 @@ bool Platform::setThreadAffinity(uint64_t cpu_id)
|
|||||||
return sched_setaffinity(gettid(), sizeof(cpu_set_t), &mn) == 0;
|
return sched_setaffinity(gettid(), sizeof(cpu_set_t), &mn) == 0;
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
uint32_t Platform::setTimerResolution(uint32_t resolution)
|
uint32_t xmrig::Platform::setTimerResolution(uint32_t resolution)
|
||||||
{
|
{
|
||||||
return resolution;
|
return resolution;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::restoreTimerResolution()
|
void xmrig::Platform::restoreTimerResolution()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::setProcessPriority(int priority)
|
void xmrig::Platform::setProcessPriority(int priority)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::setThreadPriority(int priority)
|
void xmrig::Platform::setThreadPriority(int priority)
|
||||||
{
|
{
|
||||||
if (priority == -1) {
|
if (priority == -1) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/kernel/Platform.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "Platform.h"
|
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -51,10 +51,10 @@ static inline OSVERSIONINFOEX winOsVersion()
|
|||||||
|
|
||||||
HMODULE ntdll = GetModuleHandleW(L"ntdll.dll");
|
HMODULE ntdll = GetModuleHandleW(L"ntdll.dll");
|
||||||
if (ntdll ) {
|
if (ntdll ) {
|
||||||
RtlGetVersionFunction pRtlGetVersion = reinterpret_cast<RtlGetVersionFunction>(GetProcAddress(ntdll, "RtlGetVersion"));
|
auto pRtlGetVersion = reinterpret_cast<RtlGetVersionFunction>(GetProcAddress(ntdll, "RtlGetVersion"));
|
||||||
|
|
||||||
if (pRtlGetVersion) {
|
if (pRtlGetVersion) {
|
||||||
pRtlGetVersion((LPOSVERSIONINFO) &result);
|
pRtlGetVersion(reinterpret_cast<LPOSVERSIONINFO>(&result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ static inline OSVERSIONINFOEX winOsVersion()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *Platform::createUserAgent()
|
char *xmrig::Platform::createUserAgent()
|
||||||
{
|
{
|
||||||
const auto osver = winOsVersion();
|
const auto osver = winOsVersion();
|
||||||
constexpr const size_t max = 256;
|
constexpr const size_t max = 256;
|
||||||
@@ -91,7 +91,8 @@ char *Platform::createUserAgent()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Platform::setThreadAffinity(uint64_t cpu_id)
|
#ifndef XMRIG_FEATURE_HWLOC
|
||||||
|
bool xmrig::Platform::setThreadAffinity(uint64_t cpu_id)
|
||||||
{
|
{
|
||||||
if (cpu_id >= 64) {
|
if (cpu_id >= 64) {
|
||||||
LOG_ERR("Unable to set affinity. Windows supports only affinity up to 63.");
|
LOG_ERR("Unable to set affinity. Windows supports only affinity up to 63.");
|
||||||
@@ -99,9 +100,10 @@ bool Platform::setThreadAffinity(uint64_t cpu_id)
|
|||||||
|
|
||||||
return SetThreadAffinityMask(GetCurrentThread(), 1ULL << cpu_id) != 0;
|
return SetThreadAffinityMask(GetCurrentThread(), 1ULL << cpu_id) != 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
uint32_t Platform::setTimerResolution(uint32_t resolution)
|
uint32_t xmrig::Platform::setTimerResolution(uint32_t resolution)
|
||||||
{
|
{
|
||||||
# ifdef XMRIG_AMD_PROJECT
|
# ifdef XMRIG_AMD_PROJECT
|
||||||
TIMECAPS tc;
|
TIMECAPS tc;
|
||||||
@@ -119,7 +121,7 @@ uint32_t Platform::setTimerResolution(uint32_t resolution)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::restoreTimerResolution()
|
void xmrig::Platform::restoreTimerResolution()
|
||||||
{
|
{
|
||||||
# ifdef XMRIG_AMD_PROJECT
|
# ifdef XMRIG_AMD_PROJECT
|
||||||
if (timerResolution) {
|
if (timerResolution) {
|
||||||
@@ -129,7 +131,7 @@ void Platform::restoreTimerResolution()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::setProcessPriority(int priority)
|
void xmrig::Platform::setProcessPriority(int priority)
|
||||||
{
|
{
|
||||||
if (priority == -1) {
|
if (priority == -1) {
|
||||||
return;
|
return;
|
||||||
@@ -166,7 +168,7 @@ void Platform::setProcessPriority(int priority)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::setThreadPriority(int priority)
|
void xmrig::Platform::setThreadPriority(int priority)
|
||||||
{
|
{
|
||||||
if (priority == -1) {
|
if (priority == -1) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ public:
|
|||||||
inline const String &apiId() const { return m_apiId; }
|
inline const String &apiId() const { return m_apiId; }
|
||||||
inline const String &apiWorkerId() const { return m_apiWorkerId; }
|
inline const String &apiWorkerId() const { return m_apiWorkerId; }
|
||||||
inline uint32_t printTime() const { return m_printTime; }
|
inline uint32_t printTime() const { return m_printTime; }
|
||||||
inline uint32_t version() const { return m_version; }
|
|
||||||
|
|
||||||
inline bool isWatch() const override { return m_watch && !m_fileName.isNull(); }
|
inline bool isWatch() const override { return m_watch && !m_fileName.isNull(); }
|
||||||
inline const String &fileName() const override { return m_fileName; }
|
inline const String &fileName() const override { return m_fileName; }
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ namespace xmrig
|
|||||||
|
|
||||||
static const char *kAlgo = "algo";
|
static const char *kAlgo = "algo";
|
||||||
static const char *kApi = "api";
|
static const char *kApi = "api";
|
||||||
|
static const char *kCoin = "coin";
|
||||||
static const char *kHttp = "http";
|
static const char *kHttp = "http";
|
||||||
static const char *kPools = "pools";
|
static const char *kPools = "pools";
|
||||||
|
|
||||||
@@ -103,6 +104,15 @@ void xmrig::BaseTransform::finalize(rapidjson::Document &doc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_coin.isValid() && doc.HasMember(kPools)) {
|
||||||
|
auto &pools = doc[kPools];
|
||||||
|
for (Value &pool : pools.GetArray()) {
|
||||||
|
if (!pool.HasMember(kCoin)) {
|
||||||
|
pool.AddMember(StringRef(kCoin), m_coin.toJSON(), allocator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_http) {
|
if (m_http) {
|
||||||
set(doc, kHttp, "enabled", true);
|
set(doc, kHttp, "enabled", true);
|
||||||
}
|
}
|
||||||
@@ -121,6 +131,15 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IConfig::CoinKey: /* --coin */
|
||||||
|
if (!doc.HasMember(kPools)) {
|
||||||
|
m_coin = arg;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return add(doc, kPools, kCoin, arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case IConfig::UserpassKey: /* --userpass */
|
case IConfig::UserpassKey: /* --userpass */
|
||||||
{
|
{
|
||||||
const char *p = strrchr(arg, ':');
|
const char *p = strrchr(arg, ':');
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "base/kernel/interfaces/IConfigTransform.h"
|
#include "base/kernel/interfaces/IConfigTransform.h"
|
||||||
|
#include "crypto/common/Coin.h"
|
||||||
#include "rapidjson/document.h"
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -97,6 +98,7 @@ protected:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
Algorithm m_algorithm;
|
Algorithm m_algorithm;
|
||||||
|
Coin m_coin;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public:
|
|||||||
enum Keys {
|
enum Keys {
|
||||||
// common
|
// common
|
||||||
AlgorithmKey = 'a',
|
AlgorithmKey = 'a',
|
||||||
|
CoinKey = 1025,
|
||||||
ApiWorkerIdKey = 4002,
|
ApiWorkerIdKey = 4002,
|
||||||
ApiIdKey = 4005,
|
ApiIdKey = 4005,
|
||||||
HttpPort = 4100,
|
HttpPort = 4100,
|
||||||
@@ -87,6 +88,8 @@ public:
|
|||||||
AssemblyKey = 1015,
|
AssemblyKey = 1015,
|
||||||
RandomXInitKey = 1022,
|
RandomXInitKey = 1022,
|
||||||
RandomXNumaKey = 1023,
|
RandomXNumaKey = 1023,
|
||||||
|
CPUMaxThreadsKey = 1026,
|
||||||
|
MemoryPoolKey = 1027,
|
||||||
|
|
||||||
// xmrig amd
|
// xmrig amd
|
||||||
OclPlatformKey = 1400,
|
OclPlatformKey = 1400,
|
||||||
|
|||||||
@@ -334,6 +334,9 @@ bool xmrig::Client::parseJob(const rapidjson::Value ¶ms, int *code)
|
|||||||
if (algo) {
|
if (algo) {
|
||||||
job.setAlgorithm(algo);
|
job.setAlgorithm(algo);
|
||||||
}
|
}
|
||||||
|
else if (m_pool.coin().isValid()) {
|
||||||
|
job.setAlgorithm(m_pool.coin().algorithm(job.blob()[0]));
|
||||||
|
}
|
||||||
|
|
||||||
job.setHeight(Json::getUint64(params, "height"));
|
job.setHeight(Json::getUint64(params, "height"));
|
||||||
|
|
||||||
@@ -426,7 +429,12 @@ bool xmrig::Client::verifyAlgorithm(const Algorithm &algorithm, const char *algo
|
|||||||
{
|
{
|
||||||
if (!algorithm.isValid()) {
|
if (!algorithm.isValid()) {
|
||||||
if (!isQuiet()) {
|
if (!isQuiet()) {
|
||||||
LOG_ERR("[%s] Unknown/unsupported algorithm \"%s\" detected, reconnect", url(), algo);
|
if (algo == nullptr) {
|
||||||
|
LOG_ERR("[%s] unknown algorithm, make sure you set \"algo\" or \"coin\" option", url(), algo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_ERR("[%s] unsupported algorithm \"%s\" detected, reconnect", url(), algo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -436,7 +444,7 @@ bool xmrig::Client::verifyAlgorithm(const Algorithm &algorithm, const char *algo
|
|||||||
m_listener->onVerifyAlgorithm(this, algorithm, &ok);
|
m_listener->onVerifyAlgorithm(this, algorithm, &ok);
|
||||||
|
|
||||||
if (!ok && !isQuiet()) {
|
if (!ok && !isQuiet()) {
|
||||||
LOG_ERR("[%s] Incompatible/disabled algorithm \"%s\" detected, reconnect", url(), algorithm.shortName());
|
LOG_ERR("[%s] incompatible/disabled algorithm \"%s\" detected, reconnect", url(), algorithm.shortName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
@@ -900,8 +908,14 @@ void xmrig::Client::onConnect(uv_connect_t *req, int status)
|
|||||||
LOG_ERR("[%s] connect error: \"%s\"", client->url(), uv_strerror(status));
|
LOG_ERR("[%s] connect error: \"%s\"", client->url(), uv_strerror(status));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (client->state() == ReconnectingState) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (client->state() != ConnectingState) {
|
if (client->state() != ConnectingState) {
|
||||||
|
if (!client->isQuiet()) {
|
||||||
LOG_ERR("[%s] connect error: \"invalid state: %d\"", client->url(), client->state());
|
LOG_ERR("[%s] connect error: \"invalid state: %d\"", client->url(), client->state());
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <assert.h>
|
#include <cassert>
|
||||||
|
|
||||||
|
|
||||||
#include "3rdparty/http-parser/http_parser.h"
|
#include "3rdparty/http-parser/http_parser.h"
|
||||||
@@ -225,6 +225,10 @@ bool xmrig::DaemonClient::parseJob(const rapidjson::Value ¶ms, int *code)
|
|||||||
job.setDiff(Json::getUint64(params, "difficulty"));
|
job.setDiff(Json::getUint64(params, "difficulty"));
|
||||||
job.setId(blocktemplate.data() + blocktemplate.size() - 32);
|
job.setId(blocktemplate.data() + blocktemplate.size() - 32);
|
||||||
|
|
||||||
|
if (m_pool.coin().isValid()) {
|
||||||
|
job.setAlgorithm(m_pool.coin().algorithm(job.blob()[0]));
|
||||||
|
}
|
||||||
|
|
||||||
m_job = std::move(job);
|
m_job = std::move(job);
|
||||||
m_blocktemplate = std::move(blocktemplate);
|
m_blocktemplate = std::move(blocktemplate);
|
||||||
m_prevHash = Json::getString(params, "prev_hash");
|
m_prevHash = Json::getString(params, "prev_hash");
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public:
|
|||||||
inline uint8_t fixedByte() const { return *(m_blob + 42); }
|
inline uint8_t fixedByte() const { return *(m_blob + 42); }
|
||||||
inline uint8_t index() const { return m_index; }
|
inline uint8_t index() const { return m_index; }
|
||||||
inline void reset() { m_size = 0; m_diff = 0; }
|
inline void reset() { m_size = 0; m_diff = 0; }
|
||||||
|
inline void setAlgorithm(const Algorithm::Id id) { m_algorithm = id; }
|
||||||
inline void setAlgorithm(const char *algo) { m_algorithm = algo; }
|
inline void setAlgorithm(const char *algo) { m_algorithm = algo; }
|
||||||
inline void setClientId(const String &id) { m_clientId = id; }
|
inline void setClientId(const String &id) { m_clientId = id; }
|
||||||
inline void setHeight(uint64_t height) { m_height = height; }
|
inline void setHeight(uint64_t height) { m_height = height; }
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static const char *kAlgo = "algo";
|
static const char *kAlgo = "algo";
|
||||||
|
static const char *kCoin = "coin";
|
||||||
static const char *kDaemon = "daemon";
|
static const char *kDaemon = "daemon";
|
||||||
static const char *kDaemonPollInterval = "daemon-poll-interval";
|
static const char *kDaemonPollInterval = "daemon-poll-interval";
|
||||||
static const char *kEnabled = "enabled";
|
static const char *kEnabled = "enabled";
|
||||||
@@ -120,6 +121,7 @@ xmrig::Pool::Pool(const rapidjson::Value &object) :
|
|||||||
m_fingerprint = Json::getString(object, kFingerprint);
|
m_fingerprint = Json::getString(object, kFingerprint);
|
||||||
m_pollInterval = Json::getUint64(object, kDaemonPollInterval, kDefaultPollInterval);
|
m_pollInterval = Json::getUint64(object, kDaemonPollInterval, kDefaultPollInterval);
|
||||||
m_algorithm = Json::getString(object, kAlgo);
|
m_algorithm = Json::getString(object, kAlgo);
|
||||||
|
m_coin = Json::getString(object, kCoin);
|
||||||
|
|
||||||
m_flags.set(FLAG_ENABLED, Json::getBool(object, kEnabled, true));
|
m_flags.set(FLAG_ENABLED, Json::getBool(object, kEnabled, true));
|
||||||
m_flags.set(FLAG_NICEHASH, Json::getBool(object, kNicehash));
|
m_flags.set(FLAG_NICEHASH, Json::getBool(object, kNicehash));
|
||||||
@@ -172,7 +174,7 @@ bool xmrig::Pool::isEnabled() const
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (isDaemon() && !algorithm().isValid()) {
|
if (isDaemon() && (!algorithm().isValid() && !coin().isValid())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,6 +188,7 @@ bool xmrig::Pool::isEqual(const Pool &other) const
|
|||||||
&& m_keepAlive == other.m_keepAlive
|
&& m_keepAlive == other.m_keepAlive
|
||||||
&& m_port == other.m_port
|
&& m_port == other.m_port
|
||||||
&& m_algorithm == other.m_algorithm
|
&& m_algorithm == other.m_algorithm
|
||||||
|
&& m_coin == other.m_coin
|
||||||
&& m_fingerprint == other.m_fingerprint
|
&& m_fingerprint == other.m_fingerprint
|
||||||
&& m_host == other.m_host
|
&& m_host == other.m_host
|
||||||
&& m_password == other.m_password
|
&& m_password == other.m_password
|
||||||
@@ -268,6 +271,7 @@ rapidjson::Value xmrig::Pool::toJSON(rapidjson::Document &doc) const
|
|||||||
Value obj(kObjectType);
|
Value obj(kObjectType);
|
||||||
|
|
||||||
obj.AddMember(StringRef(kAlgo), m_algorithm.toJSON(), allocator);
|
obj.AddMember(StringRef(kAlgo), m_algorithm.toJSON(), allocator);
|
||||||
|
obj.AddMember(StringRef(kCoin), m_coin.toJSON(), allocator);
|
||||||
obj.AddMember(StringRef(kUrl), m_url.toJSON(), allocator);
|
obj.AddMember(StringRef(kUrl), m_url.toJSON(), allocator);
|
||||||
obj.AddMember(StringRef(kUser), m_user.toJSON(), allocator);
|
obj.AddMember(StringRef(kUser), m_user.toJSON(), allocator);
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
#include "crypto/common/Algorithm.h"
|
#include "crypto/common/Coin.h"
|
||||||
#include "rapidjson/fwd.h"
|
#include "rapidjson/fwd.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -74,6 +74,7 @@ public:
|
|||||||
inline bool isTLS() const { return m_flags.test(FLAG_TLS); }
|
inline bool isTLS() const { return m_flags.test(FLAG_TLS); }
|
||||||
inline bool isValid() const { return !m_host.isNull() && m_port > 0; }
|
inline bool isValid() const { return !m_host.isNull() && m_port > 0; }
|
||||||
inline const Algorithm &algorithm() const { return m_algorithm; }
|
inline const Algorithm &algorithm() const { return m_algorithm; }
|
||||||
|
inline const Coin &coin() const { return m_coin; }
|
||||||
inline const String &fingerprint() const { return m_fingerprint; }
|
inline const String &fingerprint() const { return m_fingerprint; }
|
||||||
inline const String &host() const { return m_host; }
|
inline const String &host() const { return m_host; }
|
||||||
inline const String &password() const { return !m_password.isNull() ? m_password : kDefaultPassword; }
|
inline const String &password() const { return !m_password.isNull() ? m_password : kDefaultPassword; }
|
||||||
@@ -107,6 +108,7 @@ private:
|
|||||||
bool parseIPv6(const char *addr);
|
bool parseIPv6(const char *addr);
|
||||||
|
|
||||||
Algorithm m_algorithm;
|
Algorithm m_algorithm;
|
||||||
|
Coin m_coin;
|
||||||
int m_keepAlive;
|
int m_keepAlive;
|
||||||
std::bitset<FLAG_MAX> m_flags;
|
std::bitset<FLAG_MAX> m_flags;
|
||||||
String m_fingerprint;
|
String m_fingerprint;
|
||||||
|
|||||||
@@ -135,11 +135,12 @@ void xmrig::Pools::print() const
|
|||||||
{
|
{
|
||||||
size_t i = 1;
|
size_t i = 1;
|
||||||
for (const Pool &pool : m_data) {
|
for (const Pool &pool : m_data) {
|
||||||
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("POOL #%-7zu") CSI "1;%dm%s" CLEAR " algo " WHITE_BOLD("%s"),
|
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("POOL #%-7zu") CSI "1;%dm%s" CLEAR " %s " WHITE_BOLD("%s"),
|
||||||
i,
|
i,
|
||||||
(pool.isEnabled() ? (pool.isTLS() ? 32 : 36) : 31),
|
(pool.isEnabled() ? (pool.isTLS() ? 32 : 36) : 31),
|
||||||
pool.url().data(),
|
pool.url().data(),
|
||||||
pool.algorithm().isValid() ? pool.algorithm().shortName() : "auto"
|
pool.coin().isValid() ? "coin" : "algo",
|
||||||
|
pool.coin().isValid() ? pool.coin().name() : (pool.algorithm().isValid() ? pool.algorithm().shortName() : "auto")
|
||||||
);
|
);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
"huge-pages": true,
|
"huge-pages": true,
|
||||||
"hw-aes": null,
|
"hw-aes": null,
|
||||||
"priority": null,
|
"priority": null,
|
||||||
|
"memory-pool": false,
|
||||||
|
"max-threads-hint": 100,
|
||||||
"asm": true,
|
"asm": true,
|
||||||
"argon2-impl": null,
|
"argon2-impl": null,
|
||||||
"cn/0": false,
|
"cn/0": false,
|
||||||
@@ -42,6 +44,7 @@
|
|||||||
"pools": [
|
"pools": [
|
||||||
{
|
{
|
||||||
"algo": null,
|
"algo": null,
|
||||||
|
"coin": null,
|
||||||
"url": "donate.v2.xmrig.com:3333",
|
"url": "donate.v2.xmrig.com:3333",
|
||||||
"user": "YOUR_WALLET_ADDRESS",
|
"user": "YOUR_WALLET_ADDRESS",
|
||||||
"pass": "x",
|
"pass": "x",
|
||||||
|
|||||||
@@ -23,15 +23,17 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/Cpu.h"
|
|
||||||
#include "core/Controller.h"
|
#include "core/Controller.h"
|
||||||
|
#include "backend/cpu/Cpu.h"
|
||||||
|
#include "core/config/Config.h"
|
||||||
#include "core/Miner.h"
|
#include "core/Miner.h"
|
||||||
|
#include "crypto/common/VirtualMemory.h"
|
||||||
#include "net/Network.h"
|
#include "net/Network.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
|
||||||
xmrig::Controller::Controller(Process *process) :
|
xmrig::Controller::Controller(Process *process) :
|
||||||
Base(process)
|
Base(process)
|
||||||
{
|
{
|
||||||
@@ -41,6 +43,8 @@ xmrig::Controller::Controller(Process *process) :
|
|||||||
xmrig::Controller::~Controller()
|
xmrig::Controller::~Controller()
|
||||||
{
|
{
|
||||||
delete m_network;
|
delete m_network;
|
||||||
|
|
||||||
|
VirtualMemory::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -48,7 +52,10 @@ int xmrig::Controller::init()
|
|||||||
{
|
{
|
||||||
Base::init();
|
Base::init();
|
||||||
|
|
||||||
|
VirtualMemory::init(config()->cpu().memPoolSize(), config()->cpu().isHugePages());
|
||||||
|
|
||||||
m_network = new Network(this);
|
m_network = new Network(this);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,12 +72,8 @@ class MinerPrivate
|
|||||||
public:
|
public:
|
||||||
XMRIG_DISABLE_COPY_MOVE_DEFAULT(MinerPrivate)
|
XMRIG_DISABLE_COPY_MOVE_DEFAULT(MinerPrivate)
|
||||||
|
|
||||||
inline MinerPrivate(Controller *controller) : controller(controller)
|
|
||||||
{
|
inline MinerPrivate(Controller *controller) : controller(controller) {}
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
Rx::init();
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline ~MinerPrivate()
|
inline ~MinerPrivate()
|
||||||
@@ -97,7 +93,7 @@ public:
|
|||||||
bool isEnabled(const Algorithm &algorithm) const
|
bool isEnabled(const Algorithm &algorithm) const
|
||||||
{
|
{
|
||||||
for (IBackend *backend : backends) {
|
for (IBackend *backend : backends) {
|
||||||
if (backend->isEnabled(algorithm)) {
|
if (backend->isEnabled() && backend->isEnabled(algorithm)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -232,9 +228,9 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
bool initRX(IRxListener *listener)
|
inline bool initRX()
|
||||||
{
|
{
|
||||||
return Rx::init(job, controller->config()->rx().threads(), controller->config()->cpu().isHugePages(), controller->config()->rx().isNUMA(), listener);
|
return Rx::init(job, controller->config()->rx(), controller->config()->cpu().isHugePages());
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
@@ -261,6 +257,10 @@ public:
|
|||||||
xmrig::Miner::Miner(Controller *controller)
|
xmrig::Miner::Miner(Controller *controller)
|
||||||
: d_ptr(new MinerPrivate(controller))
|
: d_ptr(new MinerPrivate(controller))
|
||||||
{
|
{
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
Rx::init(this);
|
||||||
|
# endif
|
||||||
|
|
||||||
controller->addListener(this);
|
controller->addListener(this);
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_API
|
# ifdef XMRIG_FEATURE_API
|
||||||
@@ -402,7 +402,7 @@ void xmrig::Miner::setJob(const Job &job, bool donate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
const bool ready = d_ptr->initRX(this);
|
const bool ready = d_ptr->initRX();
|
||||||
# else
|
# else
|
||||||
constexpr const bool ready = true;
|
constexpr const bool ready = true;
|
||||||
# endif
|
# endif
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "base/api/interfaces/IApiListener.h"
|
#include "base/api/interfaces/IApiListener.h"
|
||||||
#include "base/kernel/interfaces/IBaseListener.h"
|
#include "base/kernel/interfaces/IBaseListener.h"
|
||||||
#include "base/kernel/interfaces/ITimerListener.h"
|
#include "base/kernel/interfaces/ITimerListener.h"
|
||||||
|
#include "base/tools/Object.h"
|
||||||
#include "crypto/common/Algorithm.h"
|
#include "crypto/common/Algorithm.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -48,6 +49,8 @@ class IBackend;
|
|||||||
class Miner : public ITimerListener, public IBaseListener, public IApiListener, public IRxListener
|
class Miner : public ITimerListener, public IBaseListener, public IApiListener, public IRxListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE_DEFAULT(Miner)
|
||||||
|
|
||||||
Miner(Controller *controller);
|
Miner(Controller *controller);
|
||||||
~Miner() override;
|
~Miner() override;
|
||||||
|
|
||||||
|
|||||||
@@ -23,9 +23,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
#include <inttypes.h>
|
#include <cinttypes>
|
||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
@@ -51,7 +51,6 @@
|
|||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static const char *kCPU = "cpu";
|
static const char *kCPU = "cpu";
|
||||||
static constexpr const uint32_t kVersion = 1;
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
static const char *kRandomX = "randomx";
|
static const char *kRandomX = "randomx";
|
||||||
@@ -79,7 +78,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xmrig::Config::Config() : BaseConfig(),
|
xmrig::Config::Config() :
|
||||||
d_ptr(new ConfigPrivate())
|
d_ptr(new ConfigPrivate())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -119,10 +118,6 @@ bool xmrig::Config::isShouldSave() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version() < kVersion) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_OPENCL
|
# ifdef XMRIG_FEATURE_OPENCL
|
||||||
if (cl().isShouldSave()) {
|
if (cl().isShouldSave()) {
|
||||||
return true;
|
return true;
|
||||||
@@ -139,7 +134,7 @@ bool xmrig::Config::read(const IJsonReader &reader, const char *fileName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
d_ptr->cpu.read(reader.getValue(kCPU), version());
|
d_ptr->cpu.read(reader.getValue(kCPU));
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
if (!d_ptr->rx.read(reader.getValue(kRandomX))) {
|
if (!d_ptr->rx.read(reader.getValue(kRandomX))) {
|
||||||
@@ -170,7 +165,6 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const
|
|||||||
doc.AddMember("api", api, allocator);
|
doc.AddMember("api", api, allocator);
|
||||||
doc.AddMember("http", m_http.toJSON(doc), allocator);
|
doc.AddMember("http", m_http.toJSON(doc), allocator);
|
||||||
doc.AddMember("autosave", isAutoSave(), allocator);
|
doc.AddMember("autosave", isAutoSave(), allocator);
|
||||||
doc.AddMember("version", kVersion, allocator);
|
|
||||||
doc.AddMember("background", isBackground(), allocator);
|
doc.AddMember("background", isBackground(), allocator);
|
||||||
doc.AddMember("colors", Log::colors, allocator);
|
doc.AddMember("colors", Log::colors, allocator);
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,12 @@
|
|||||||
#define XMRIG_CONFIG_H
|
#define XMRIG_CONFIG_H
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/CpuConfig.h"
|
#include "backend/cpu/CpuConfig.h"
|
||||||
#include "base/kernel/config/BaseConfig.h"
|
#include "base/kernel/config/BaseConfig.h"
|
||||||
|
#include "base/tools/Object.h"
|
||||||
#include "rapidjson/fwd.h"
|
#include "rapidjson/fwd.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -46,6 +47,8 @@ class OclConfig;
|
|||||||
class Config : public BaseConfig
|
class Config : public BaseConfig
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE(Config);
|
||||||
|
|
||||||
Config();
|
Config();
|
||||||
~Config() override;
|
~Config() override;
|
||||||
|
|
||||||
|
|||||||
@@ -138,6 +138,13 @@ void xmrig::ConfigTransform::transform(rapidjson::Document &doc, int key, const
|
|||||||
return transformUint64(doc, key, p ? strtoull(p, nullptr, 16) : strtoull(arg, nullptr, 10));
|
return transformUint64(doc, key, p ? strtoull(p, nullptr, 16) : strtoull(arg, nullptr, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case IConfig::CPUMaxThreadsKey: /* --cpu-max-threads-hint */
|
||||||
|
return set(doc, kCpu, "max-threads-hint", static_cast<uint64_t>(strtol(arg, nullptr, 10)));
|
||||||
|
|
||||||
|
case IConfig::MemoryPoolKey: /* --cpu-memory-pool */
|
||||||
|
return set(doc, kCpu, "memory-pool", static_cast<int64_t>(strtol(arg, nullptr, 10)));
|
||||||
|
break;
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_ASM
|
# ifdef XMRIG_FEATURE_ASM
|
||||||
case IConfig::AssemblyKey: /* --asm */
|
case IConfig::AssemblyKey: /* --asm */
|
||||||
return set(doc, kCpu, "asm", arg);
|
return set(doc, kCpu, "asm", arg);
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ R"===(
|
|||||||
"huge-pages": true,
|
"huge-pages": true,
|
||||||
"hw-aes": null,
|
"hw-aes": null,
|
||||||
"priority": null,
|
"priority": null,
|
||||||
|
"memory-pool": false,
|
||||||
|
"max-threads-hint": 100,
|
||||||
"asm": true,
|
"asm": true,
|
||||||
"argon2-impl": null,
|
"argon2-impl": null,
|
||||||
"cn/0": false,
|
"cn/0": false,
|
||||||
@@ -76,6 +78,7 @@ R"===(
|
|||||||
"pools": [
|
"pools": [
|
||||||
{
|
{
|
||||||
"algo": null,
|
"algo": null,
|
||||||
|
"coin": null,
|
||||||
"url": "donate.v2.xmrig.com:3333",
|
"url": "donate.v2.xmrig.com:3333",
|
||||||
"user": "YOUR_WALLET_ADDRESS",
|
"user": "YOUR_WALLET_ADDRESS",
|
||||||
"pass": "x",
|
"pass": "x",
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ static const char short_options[] = "a:c:kBp:Px:r:R:s:t:T:o:u:O:v:l:S";
|
|||||||
|
|
||||||
static const option options[] = {
|
static const option options[] = {
|
||||||
{ "algo", 1, nullptr, IConfig::AlgorithmKey },
|
{ "algo", 1, nullptr, IConfig::AlgorithmKey },
|
||||||
|
{ "coin", 1, nullptr, IConfig::CoinKey },
|
||||||
# ifdef XMRIG_FEATURE_HTTP
|
# ifdef XMRIG_FEATURE_HTTP
|
||||||
{ "api-worker-id", 1, nullptr, IConfig::ApiWorkerIdKey },
|
{ "api-worker-id", 1, nullptr, IConfig::ApiWorkerIdKey },
|
||||||
{ "api-id", 1, nullptr, IConfig::ApiIdKey },
|
{ "api-id", 1, nullptr, IConfig::ApiIdKey },
|
||||||
@@ -81,6 +82,9 @@ static const option options[] = {
|
|||||||
{ "userpass", 1, nullptr, IConfig::UserpassKey },
|
{ "userpass", 1, nullptr, IConfig::UserpassKey },
|
||||||
{ "rig-id", 1, nullptr, IConfig::RigIdKey },
|
{ "rig-id", 1, nullptr, IConfig::RigIdKey },
|
||||||
{ "no-cpu", 0, nullptr, IConfig::CPUKey },
|
{ "no-cpu", 0, nullptr, IConfig::CPUKey },
|
||||||
|
{ "max-cpu-usage", 1, nullptr, IConfig::CPUMaxThreadsKey },
|
||||||
|
{ "cpu-max-threads-hint", 1, nullptr, IConfig::CPUMaxThreadsKey },
|
||||||
|
{ "cpu-memory-pool", 1, nullptr, IConfig::MemoryPoolKey },
|
||||||
# ifdef XMRIG_FEATURE_TLS
|
# ifdef XMRIG_FEATURE_TLS
|
||||||
{ "tls", 0, nullptr, IConfig::TlsKey },
|
{ "tls", 0, nullptr, IConfig::TlsKey },
|
||||||
{ "tls-fingerprint", 1, nullptr, IConfig::FingerprintKey },
|
{ "tls-fingerprint", 1, nullptr, IConfig::FingerprintKey },
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ static inline const std::string &usage()
|
|||||||
u += "Usage: " APP_ID " [OPTIONS]\n\nNetwork:\n";
|
u += "Usage: " APP_ID " [OPTIONS]\n\nNetwork:\n";
|
||||||
u += " -o, --url=URL URL of mining server\n";
|
u += " -o, --url=URL URL of mining server\n";
|
||||||
u += " -a, --algo=ALGO mining algorithm https://xmrig.com/docs/algorithms\n";
|
u += " -a, --algo=ALGO mining algorithm https://xmrig.com/docs/algorithms\n";
|
||||||
|
u += " --coin=COIN specify coin instead of algorithm\n";
|
||||||
u += " -u, --user=USERNAME username for mining server\n";
|
u += " -u, --user=USERNAME username for mining server\n";
|
||||||
u += " -p, --pass=PASSWORD password for mining server\n";
|
u += " -p, --pass=PASSWORD password for mining server\n";
|
||||||
u += " -O, --userpass=U:P username:password pair for mining server\n";
|
u += " -O, --userpass=U:P username:password pair for mining server\n";
|
||||||
@@ -76,6 +77,8 @@ static inline const std::string &usage()
|
|||||||
u += " -v, --av=N algorithm variation, 0 auto select\n";
|
u += " -v, --av=N algorithm variation, 0 auto select\n";
|
||||||
u += " --cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1\n";
|
u += " --cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1\n";
|
||||||
u += " --cpu-priority set process priority (0 idle, 2 normal to 5 highest)\n";
|
u += " --cpu-priority set process priority (0 idle, 2 normal to 5 highest)\n";
|
||||||
|
u += " --cpu-max-threads-hint=N maximum CPU threads count (in percentage) hint for autoconfig\n";
|
||||||
|
u += " --cpu-memory-pool=N number of 2 MB pages for persistent memory pool, -1 (auto), 0 (disable)\n";
|
||||||
u += " --no-huge-pages disable huge pages support\n";
|
u += " --no-huge-pages disable huge pages support\n";
|
||||||
u += " --asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer\n";
|
u += " --asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer\n";
|
||||||
|
|
||||||
|
|||||||
@@ -103,14 +103,15 @@ static AlgoName const algorithm_names[] = {
|
|||||||
{ "cryptonight_turtle", "cn_turtle", Algorithm::CN_PICO_0 },
|
{ "cryptonight_turtle", "cn_turtle", Algorithm::CN_PICO_0 },
|
||||||
# endif
|
# endif
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
{ "randomx/0", "rx/0", Algorithm::RX_0 },
|
||||||
{ "randomx/test", "rx/test", Algorithm::RX_0 },
|
{ "randomx/test", "rx/test", Algorithm::RX_0 },
|
||||||
{ "randomx/0", "rx/0", Algorithm::RX_0 },
|
|
||||||
{ "randomx/0", "rx/0", Algorithm::RX_0 },
|
|
||||||
{ "RandomX", "rx", Algorithm::RX_0 },
|
{ "RandomX", "rx", Algorithm::RX_0 },
|
||||||
{ "randomx/wow", "rx/wow", Algorithm::RX_WOW },
|
{ "randomx/wow", "rx/wow", Algorithm::RX_WOW },
|
||||||
{ "RandomWOW", nullptr, Algorithm::RX_WOW },
|
{ "RandomWOW", nullptr, Algorithm::RX_WOW },
|
||||||
{ "randomx/loki", "rx/loki", Algorithm::RX_LOKI },
|
{ "randomx/loki", "rx/loki", Algorithm::RX_LOKI },
|
||||||
{ "RandomXL", nullptr, Algorithm::RX_LOKI },
|
{ "RandomXL", nullptr, Algorithm::RX_LOKI },
|
||||||
|
{ "randomx/arq", "rx/arq", Algorithm::RX_ARQ },
|
||||||
|
{ "RandomARQ", nullptr, Algorithm::RX_ARQ },
|
||||||
# endif
|
# endif
|
||||||
# ifdef XMRIG_ALGO_ARGON2
|
# ifdef XMRIG_ALGO_ARGON2
|
||||||
{ "argon2/chukwa", nullptr, Algorithm::AR2_CHUKWA },
|
{ "argon2/chukwa", nullptr, Algorithm::AR2_CHUKWA },
|
||||||
@@ -142,6 +143,9 @@ size_t xmrig::Algorithm::l2() const
|
|||||||
case RX_WOW:
|
case RX_WOW:
|
||||||
return 0x20000;
|
return 0x20000;
|
||||||
|
|
||||||
|
case RX_ARQ:
|
||||||
|
return 0x10000;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -172,6 +176,9 @@ size_t xmrig::Algorithm::l3() const
|
|||||||
case RX_WOW:
|
case RX_WOW:
|
||||||
return oneMiB;
|
return oneMiB;
|
||||||
|
|
||||||
|
case RX_ARQ:
|
||||||
|
return oneMiB / 4;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -262,6 +269,7 @@ xmrig::Algorithm::Family xmrig::Algorithm::family(Id id)
|
|||||||
case RX_0:
|
case RX_0:
|
||||||
case RX_WOW:
|
case RX_WOW:
|
||||||
case RX_LOKI:
|
case RX_LOKI:
|
||||||
|
case RX_ARQ:
|
||||||
return RANDOM_X;
|
return RANDOM_X;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user