libtorrent's storage implementation is customizable. That means a special purpose bittorrent
client can replace the default way to store files on disk.
When implementing a bittorrent cache, it doesn't matter how the data is stored on disk, as
diff --git a/docs/features.rst b/docs/features.rst
index 2aaf6a3f6..452fb8fff 100644
--- a/docs/features.rst
+++ b/docs/features.rst
@@ -277,6 +277,9 @@ to provide additional bandwidth to an entire feed.
merkle hash tree torrents
-------------------------
+.. image:: merkle_tree.png
+ :align: right
+
Merkle hash tree torrents is an extension that lets a torrent file only contain the
root hash of the hash tree forming the piece hashes. The main benefit of this feature
is that regardless of how many pieces there is in a torrent, the .torrent file will
@@ -305,17 +308,15 @@ which lets peers verify every block of data received from peers, immediately. Th
gives a minimum turnaround time and completely removes the problem of identifying malicious
peers.
-.. image:: merkle_tree.png
-
The root hash is built by hashing all the piece hashes pair-wise, until they all collapse
down to the root.
-.. image:: storage.png
- :align: right
-
customizable file storage
-------------------------
+.. image:: storage.png
+ :align: right
+
libtorrent's storage implementation is customizable. That means a special purpose bittorrent
client can replace the default way to store files on disk.
diff --git a/docs/gen_todo.py b/docs/gen_todo.py
index fb457418a..418be2db4 100644
--- a/docs/gen_todo.py
+++ b/docs/gen_todo.py
@@ -45,6 +45,10 @@ for f in files:
items[-1]['priority'] = 0
if line[0] in '0123456789':
items[-1]['priority'] = int(line[0])
+ if int(line[0]) > 5:
+ print 'priority too high: ' + line
+ sys.exit(1)
+
line = line[1:].strip()
items[-1]['todo'] = line
prio = items[-1]['priority']
diff --git a/docs/hacking.diagram b/docs/hacking.diagram
new file mode 100644
index 000000000..f6c7cb075
--- /dev/null
+++ b/docs/hacking.diagram
@@ -0,0 +1,26 @@
++--------------+ pimpl +--------------+
+| cGRE session +----------->| session_impl |
++--------------+ +------+-----+-+
+ m_torrents[] | |
++---------------------+ | |
+| cGRE torrent_handle +-------+ | |
++---------------------+ weak | | |
+ | | | m_connections[]
+ | | +---+-------+
+ | | | |
+ m_picker v v | v peers we are connected to
+ +--------------+ +--------++ +-----------------+
+ | piece_picker |<---+-+ torrent ++ +--+ peer_connection ++
+ +--------------+ | ++--------+| | ++----------------+|
+ m_torrent_file | +---------+ | +-----------------+
+ +-------------------+ | |
+ | cGRE torrent_info |<---+ | m_socket
+ +-------------------+ | | +--------------------------+
+ | +------+->| socket_type (variant) |
+ +--------+ m_policy | | | (TCP/uTP/SSL/socks5/...) |
+ | policy |<---------+ | +--------------------------+
+ +------+-+ v
+ list of all | m_peers[] +--------------+
+ peers we +-------------->| policy::peer ++ contains contact information
+ know of ++-------------+| for peers we're not necessarily
+ +--------------+ connected to
diff --git a/docs/hacking.rst b/docs/hacking.rst
index 91477f86e..244cd3ce8 100644
--- a/docs/hacking.rst
+++ b/docs/hacking.rst
@@ -62,43 +62,8 @@ structure
This is the high level structure of libtorrent. Bold types are part of the public
interface:
-.. parsed-literal::
- +=========+ pimpl +-------------------+
- | **session** | ---------> | aux::session_impl |
- +=========+ +-------------------+
- m_torrents[] | |
- +================+ | |
- | **torrent_handle** | ------+ | |
- +================+ | | |
- | | | m_connections[]
- | | |
- | | +---------------------+
- m_picker v v |
- +--------------+ +---------+---------+-- . . |
- | piece_picker | <--+-| torrent | torrent | to |
- +--------------+ | +---------+---------+-- . . |
- m_torrent_file | | m_connections[] |
- +==============+ | | |
- | **torrent_info** | <--+ v v
- +==============+ | +-----------------+-----------------+-- . .
- m_policy | | peer_connection | peer_connection | pe
- +--------+ | +-----------------+-----------------+-- . .
- | policy | <--------+ | | m_socket
- +--------+ | |
- | m_peers[] | v
- | | +-----------------------+
- | | | socket_type (variant) |
- v | +-----------------------+
- +--------------+ |
- | policy::peer | |
- +--------------+ |
- | policy::peer | |
- +--------------+ m_peer_info|
- | policy::peer | <----------+
- +--------------+
- . .
- + - - - - - - -+
+.. image:: hacking.png
session_impl
------------
diff --git a/docs/makefile b/docs/makefile
index 535ef4206..7293b14dd 100644
--- a/docs/makefile
+++ b/docs/makefile
@@ -42,7 +42,13 @@ TARGETS = index \
streaming \
$(REFERENCE_TARGETS)
-FIGURES = read_disk_buffers write_disk_buffers troubleshooting
+FIGURES = \
+ read_disk_buffers \
+ write_disk_buffers \
+ troubleshooting \
+ hacking \
+ utp_stack \
+ storage
html: $(TARGETS:=.html) $(FIGURES:=.png) todo.html
@@ -65,10 +71,6 @@ troubleshooting_thumb.png: troubleshooting.png
convert troubleshooting.png -resize 800x800 troubleshooting_thumb.png
cp $@ $(WEB_PATH)/$@
-troubleshooting.png: troubleshooting.dot
- dot troubleshooting.dot -Tpng >troubleshooting.png
- cp $@ $(WEB_PATH)/$@
-
todo.html:gen_todo.py ../src/*.cpp ../include/libtorrent/*.hpp
python gen_todo.py
cp $@ $(WEB_PATH)/$@
@@ -94,6 +96,10 @@ $(REFERENCE_TARGETS:=.rst):gen_reference_doc.py ../include/libtorrent/*.hpp ../i
dot -Teps $? >$@
cp $@ $(WEB_PATH)/$@
+%.png:%.diagram
+ java -jar /opt/local/share/java/ditaa0_9.jar -E $? $@
+ cp $@ $(WEB_PATH)/$@
+
clean:
rm -f $(TARGETS:=.html) $(TARGETS:=.pdf) settings.rst todo.html reference*.html reference*.rst
diff --git a/docs/read_disk_buffers.diagram b/docs/read_disk_buffers.diagram
new file mode 100644
index 000000000..6ffa96479
--- /dev/null
+++ b/docs/read_disk_buffers.diagram
@@ -0,0 +1,16 @@
+
+ copy into peer's encrypt in place
++----------------+ send buffer +-------------+ (no copy) +-------------+
+| receive buffer +----------------->| send buffer +--=--------------->| encrypted |
+| | | | | send buffer |
++----------------+ +-------------+ +------+------+
+ ^ |
+ | read() from file write() to socket |
+ | (copy) (copy) |
+---=----|---------------------------------=---------------------------------|--=----
+ | kernel space |
+ | v
++-------+-----------+ +---------------+
+| kernel page cache | | socket kernel |
+| | | buffer |
++-------------------+ +---------------+
diff --git a/docs/read_disk_buffers.dot b/docs/read_disk_buffers.dot
deleted file mode 100644
index f110c3af3..000000000
--- a/docs/read_disk_buffers.dot
+++ /dev/null
@@ -1,20 +0,0 @@
-digraph uploading {
-
- node [shape=box];
-
- subgraph user_space {
- rank=same;
- "disk cache" -> "send buffer" [label="copy into peer's send buffer (copy)"]
- "send buffer" -> "encrypted send buffer" [label="encrypt in-place (no copy)" style=dashed];
- }
-
- subgraph kernel {
- rank=same;
- "kernel page cache";
- "socket kernel buffer"
- }
-
- "encrypted send buffer" -> "socket kernel buffer" [label="write() to socket (copy)"];
- "kernel page cache" -> "disk cache" [label="read() from file (copy)"]
-}
-
diff --git a/docs/read_disk_buffers.png b/docs/read_disk_buffers.png
index 4b146b0ef..72e07defa 100644
Binary files a/docs/read_disk_buffers.png and b/docs/read_disk_buffers.png differ
diff --git a/docs/storage.diagram b/docs/storage.diagram
new file mode 100644
index 000000000..8f0618d7d
--- /dev/null
+++ b/docs/storage.diagram
@@ -0,0 +1,31 @@
++--------------------------+
+| disk_io_thread |
+| (manages piece cache) |
++--------------------------+
+ ^
+ |
+ v
++--------------------------+
+| piece_manager |
+| (maps pieces to slots) |
++--------------------------+
+ ^
+ |
+ v customization point
+/--------------------------\ +------------------+
+| storage |<---->| file_pool |
+| cGRE | | open file cache |
+| (maps slots to file and | +------------------+
+| offset. reads and writes |
+| to disk) | +------------------+
+| |<-----+ file_storage |
+\--------------------------/ | standard slot to |
+ ^ | file mapping |
+ | +------------------+
+ v
++--------------------------+
+| file |
+| (file class reads and |
+| writes files) |
++--------------------------+
+
diff --git a/docs/storage.graffle b/docs/storage.graffle
deleted file mode 100644
index 7ba02ef8f..000000000
--- a/docs/storage.graffle
+++ /dev/null
@@ -1,1726 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGraffle
- 137.11.0.108132
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- fill
-
- GradientColor
-
- w
- 0.666667
-
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- CanvasSize
- {576, 733}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2009-05-24 18:38:49 -0700
- Creator
- Arvid Norberg
- DisplayScale
- 1.000 cm = 1.000 cm
- FileType
- flat
- GraphDocumentVersion
- 6
- GraphicsList
-
-
- Bounds
- {{113, 177.5}, {103, 28}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 36
-
- ID
- 45
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 storage_interface\
-customization point}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- ID
- 43
- Points
-
- {6.4195, 204.5}
- {179.999, 204.5}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Pattern
- 1
- TailArrow
- 0
-
-
-
-
- Bounds
- {{63.5, 67.5}, {53, 40}}
- Class
- ShapedGraphic
- Head
-
- ID
- 1
-
- ID
- 32
- Rotation
- 90
- Shape
- AdjustableArrow
- ShapeData
-
- ratio
- 0.50000017881393433
- width
- 20.000001907348633
-
- Style
-
- fill
-
- Color
-
- b
- 0.497307
- g
- 0.504555
- r
- 1
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- b
- 0.304265
- g
- 0.307897
- r
- 0.788251
-
- MiddleFraction
- 0.4523809552192688
-
- shadow
-
- Color
-
- a
- 0.4
- b
- 0
- g
- 0
- r
- 0
-
- ShadowVector
- {0, 2}
-
- stroke
-
- Color
-
- b
- 0
- g
- 0.0271458
- r
- 0.689052
-
-
-
- Tail
-
- ID
- 31
-
- TextRelativeArea
- {{0.125, 0.25}, {0.75, 0.5}}
- isConnectedShape
-
-
-
- Bounds
- {{6.4195, 6.5}, {167.161, 54}}
- Class
- ShapedGraphic
- ID
- 31
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 disk_io_thread
-\fs24 \
-manages piece cache}
-
-
-
- Bounds
- {{58.75, 180.25}, {62.5, 40}}
- Class
- ShapedGraphic
- Head
-
- ID
- 3
-
- ID
- 30
- Rotation
- 90
- Shape
- AdjustableArrow
- ShapeData
-
- ratio
- 0.50000017881393433
- width
- 20.000001907348633
-
- Style
-
- fill
-
- Color
-
- b
- 0.497307
- g
- 0.504555
- r
- 1
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- b
- 0.304265
- g
- 0.307897
- r
- 0.788251
-
- MiddleFraction
- 0.4523809552192688
-
- shadow
-
- Color
-
- a
- 0.4
- b
- 0
- g
- 0
- r
- 0
-
- ShadowVector
- {0, 2}
-
- stroke
-
- Color
-
- b
- 0
- g
- 0.0271458
- r
- 0.689052
-
-
-
- Tail
-
- ID
- 1
-
- TextRelativeArea
- {{0.125, 0.25}, {0.75, 0.5}}
- isConnectedShape
-
-
-
- Bounds
- {{6.4195, 232}, {167.161, 72}}
- Class
- ShapedGraphic
- ID
- 3
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 storage
-\fs24 \
-maps slots to file and offset\
-reads and writes to and from disk}
-
-
-
- Bounds
- {{6.4195, 114.5}, {167.161, 54}}
- Class
- ShapedGraphic
- ID
- 1
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 piece_manager
-\fs24 \
-maps pieces to slots}
-
-
-
- GridInfo
-
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2009-05-24 19:23:30 -0700
- Modifier
- Arvid Norberg
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- OutlineStyle
- Basic
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlVk2P2zYQvetXzDE5mOZQJCVeu2mB
- 5NTUBnoIgoWglWMllrWRlBbIj81v6QxJfdnebRax1vAsRT5q3rx51Fd4D19B0mUyC1ma
- QlfB33AGKaz0H6hhe9cjlD2gv/oSNlKYeHeOIkBCAAfY/ll1ZfU4fCtO0NW0BTreRALt
- stHC5FK7HIx2wkDZwPZtg/Cm9Q8zznR6MVOjTsI8Nc6zygPmBowDnecRJx3vjzirHa3J
- hIlIepwZkTKPZKWNSCbc3/5VnYqh/qe6a09tVzfV0NUlJ2WFRmekAmMpI0CbCbRISQUK
- EN4RX58De3c7/7ASdndMhv9nwz9MOSU2YSFeY+2IF6qB4hpIIP4lFWWBQtQah4HJ3/aA
- eYTPYWOVkPSUjkb2TbL9A4Wk3fcHePVYV2V13xTn4lPVvYb9Z/h9H/iPq+ESNvC9QQUb
- o0VqMq0ATbKn8i1wm+KxBw/ew9BCf2qHfoZ/TlbJRIJWbqIzUyzJwzLfa9ZUSo8S+fcL
- kp/gTFuvvQvGUikkSYfEh5o4C7klgbN+aDuia05nXYQF4IKrTAnjMmuZ9zWcp8oTxEz9
- eBFsJogkS6rHywKcKijOD9AeXoRnUqGMybNrvENfDS+C2mRWyDRDvKGOrioeev98/3b1
- UHmJ8NMeuraB53dJuFALXpG0ZJ1TQGIZiY3afqj7LzMYO1xOLWI1NIDSR8kpRIrbhmKk
- 0Riz7GUYzubRzAnHn2naMWImjfdLy05G60Aj2JTi6KNXRihJWPwnfX+lSpDtsLPtjpj0
- R+rAJwx5tJOrDmJrETZ30igyWCFVhpr8NXnSa4gLtC5ywVHgQuHMxRgTFyqlYaKLuBhH
- Jy7GAc9FwIx9tz4vpsa23AxTp45OGU6G/3NGu1rJ/K56PLnpiyQQWkb8XnS5yYVJnTHe
- F1f+xdq5r9v74chafZ3cNsYV7kKUhEvKl2Rf5lKUwWqjN0JZlMdqRo8aJX5iXTgKdbGp
- rxApNERUE4s8RBUJI1RQCqhGvg4Bg89wr0mLlCqr0uif06TVJh6Ru6OCX5ZkMkuSyH6i
- yJwBjpljTJxeAEJn+sDJhM7GkLYfoDX+NyTNq1kPH0DT9ZG2eqAvXze25BeASZNK8olL
- zhBkbSAMnNbyunHsoj/2jeb+iApbKEFbkVqVwia9FEI8Re7r81B1h6K8fZ48j26Q0GVK
- vTSfKtH8ym+0QVN/p3eW9gyPLW0zeWHy/j+HvTh4CmVuZHN0cmVhbQplbmRvYmoKNSAw
- IG9iago5MjEKZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAzIDAg
- UiAvUmVzb3VyY2VzIDYgMCBSIC9Db250ZW50cyA0IDAgUiAvTWVkaWFCb3ggWzAgMCA1
- NzYgNzMzXQo+PgplbmRvYmoKNiAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL1RleHQg
- L0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSAvQ29sb3JTcGFjZSA8PCAvQ3MyIDE4IDAg
- UgovQ3MxIDcgMCBSID4+IC9Gb250IDw8IC9GMS4wIDE5IDAgUiA+PiAvWE9iamVjdCA8
- PCAvSW0yIDEwIDAgUiAvSW00IDE0IDAgUgovSW01IDE2IDAgUiAvSW0xIDggMCBSIC9J
- bTMgMTIgMCBSID4+IC9TaGFkaW5nIDw8IC9TaDEgMjAgMCBSIC9TaDIgMjEgMCBSCj4+
- ID4+CmVuZG9iagoyMCAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5
- cGUgMiAvQ29vcmRzIFsgMzEuNzUgLTIwLjUgMzEuNzUgMjAuNTAwMDEgXQovRG9tYWlu
- IFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDIyIDAgUiA+
- PgplbmRvYmoKMjEgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBl
- IDIgL0Nvb3JkcyBbIDI3IC0yMC41IDI3IDIwLjUwMDAxIF0gL0RvbWFpbgpbIDAgMSBd
- IC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAyMyAwIFIgPj4KZW5kb2Jq
- CjEwIDAgb2JqCjw8IC9MZW5ndGggMTEgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBl
- IC9JbWFnZSAvV2lkdGggMzgwIC9IZWlnaHQgMTg4IC9Db2xvclNwYWNlCjI0IDAgUiAv
- U01hc2sgMjUgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNv
- ZGUgPj4Kc3RyZWFtCngB7dABDQAAAMKg909tDjeIQGHAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBv4GBkVd
- AAEKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9iago5NTgKZW5kb2JqCjE0IDAgb2JqCjw8
- IC9MZW5ndGggMTUgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lk
- dGggMzgwIC9IZWlnaHQgMTUyIC9Db2xvclNwYWNlCjI3IDAgUiAvU01hc2sgMjggMCBS
- IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFt
- CngB7dAxAQAAAMKg9U9tDQ+IQGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgy8Dwyk/gABCmVuZHN0cmVhbQplbmRvYmoKMTUgMCBvYmoKNzc5CmVuZG9i
- agoxNiAwIG9iago8PCAvTGVuZ3RoIDE3IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlw
- ZSAvSW1hZ2UgL1dpZHRoIDEyNCAvSGVpZ2h0IDE1MCAvQ29sb3JTcGFjZQozMCAwIFIg
- L1NNYXNrIDMxIDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVj
- b2RlID4+CnN0cmVhbQp4Ae3QMQEAAADCoPVPbQlPiEBhwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGPgMDNn4AAEKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9i
- agoyNjcKZW5kb2JqCjggMCBvYmoKPDwgL0xlbmd0aCA5IDAgUiAvVHlwZSAvWE9iamVj
- dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDM4MCAvSGVpZ2h0IDE1MiAvQ29sb3JTcGFj
- ZQoyNyAwIFIgL1NNYXNrIDMzIDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
- L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QMQEAAADCoPVPbQ0PiEBhwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMvA8MpP4AAQplbmRzdHJlYW0KZW5k
- b2JqCjkgMCBvYmoKNzc5CmVuZG9iagoxMiAwIG9iago8PCAvTGVuZ3RoIDEzIDAgUiAv
- VHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDEyNCAvSGVpZ2h0IDE3
- MCAvQ29sb3JTcGFjZQozNSAwIFIgL1NNYXNrIDM2IDAgUiAvQml0c1BlckNvbXBvbmVu
- dCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QgQAAAADDoPlT3+AE
- hVBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABA29g9wgAAQplbmRzdHJlYW0KZW5kb2JqCjEzIDAg
- b2JqCjI5OQplbmRvYmoKMzEgMCBvYmoKPDwgL0xlbmd0aCAzMiAwIFIgL1R5cGUgL1hP
- YmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxMjQgL0hlaWdodCAxNTAgL0NvbG9y
- U3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0
- ZURlY29kZSA+PgpzdHJlYW0KeAHtm9dWYt0ShTuYExJEyTkLiAQREBGRZMQc29B2v/8j
- nFm1NpuNgiLQZ/wXrIseijQfFVbYNWt9+zYaIw+MPPDf8MD3Hsewv62E/cHjZ8ch/ia9
- cXh8+kB8NCPHxBhvG9KL/Aa8kd4/HLog43PHxgg4QWPyzeAX6a9jY3jj0OhsswAzc2pq
- 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
- fEj7xzDQn8HprI4GOoy7WzqTS1vXcNCfwvF8dHOLIbcLDs3qT9yOXa1xxg2TaJM8axwf
- 0Jl4SA7/INtxiMJzSu3giBpFMdAeegR0kc4KVOrg4xkXmHpdSAXs7b+dEk6c4PbQpnqE
- Blm0xR7hKYS7YuPRIaI7xpyOj/SYVKlxYzDagWsV6omlE9LwrO4Sc8D5qXivUqVu6Gpl
- Tzx0DhvdyXI6TKQ20RSNPvByea+0ixZoPOnTI+ewYt2M/fuY+0IRuQ9d7juP/AN0B8up
- GhGLo/8+l9vayqHjPRVHSYvqaTggDSHDm1Z3iDnXI1bR/Z/cSGNsJNHpvyrqC0NHv7Pc
- 3Lz1QNctcMFCuuFAx8IhW/3Gcjq9mqwOl9ePWyZ0xwQ3S/xel8Nq4hMpP3b1djZTuvaj
- nxUJx6Vli03ccgkGxY0WW6uYNNhq1ulLyHCc21EIgul8u8fjETd5TAaUc/Dk87WzWSdQ
- p9eacHpiUev0dKvJZrM7HHYbbDau6KmKhXLx8K2mL9MG1+r0y3SbCwM3t5b1OlE5/Edo
- GY7HJbrGJm6xrayIG2uiTo1HzeGmWSsAkuXS9T2+vafT8U096aLev0O3LKdri81bi+KG
- onxBsWsdqWVCnz+R5T/HJTkFtzUXMOhmphBEBr6d+PG3YjiV9+maqrikCnBLCOpWPfv4
- U3v8K+B4RmblblLczaWruEJ9I+Gxx4/p721cmSAdC66H+eACjPQe/CpqD9+H4Ig6jOdb
- 0aQ3ynpnD/99sLcALuHxDcToTeYdDCv9b6aTTi0N8ftQPrqXDxG41r+9/J/hvofYw/3E
- 0aeNPDDywMgDg3vgf1KX+AYKZW5kc3RyZWFtCmVuZG9iagozMiAwIG9iagozMzY1CmVu
- ZG9iagoyOCAwIG9iago8PCAvTGVuZ3RoIDI5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3Vi
- dHlwZSAvSW1hZ2UgL1dpZHRoIDM4MCAvSGVpZ2h0IDE1MiAvQ29sb3JTcGFjZQovRGV2
- aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
- CnN0cmVhbQp4Ae3d21dT97YHcCWBkAu5QEhCLiQkEFgECIFg5CZBMHKLYIQSRRCM0oJB
- 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
- YmoKMjkgMCBvYmoKMzQ5NgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCAyNiAwIFIg
- L1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAzODAgL0hlaWdodCAx
- ODggL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt2P07m+m2B/CWEJGIhEjIi0RCeCRE
- iKbeKkrVa6kytEppWjM0qrUnZVerVNtMtapMbdQU7Xi5aA0uu0xP6zr/2lkPPdc+u9LO
- LHP/dPb6/tDLD8tKr8+zrPvOc+QIhQRIgARIgARIgAT+0wSOUhgIIKcGPjHgXwmkHE7g
- X4QA+qcewb47fJpAEET5ywICgSAwkH8Kf+y/J7/PHiwUhuxHREELfKYTCoOD4fkJPvN/
- Y/o/ywcFBQO7KDRULBZLJJIwyiEEAA74xKGikBAh8O9N/zdWD08fCJsG4IFdEiaVhstk
- csohBWSycKlUGibh/YF/b/a/tvf36GHmefkwabhcHhGpUERFKZUqCl5AqYxSKCIj5HIZ
- zw/6+5vnK/j81PNDz8vLwF2pio5RqzVarY6CFtBqNWp1TLQKnkCEPFwqDg0J2R99v/h7
- 9LDoxRKQB3hQ1+kNhjijiXIIAaMxzqCP1WnU0SpFpFwaBqMP+HDf8XfeHuV3vVAEQy+P
- VEarwd1oSjAnJnFccrKFghJITuY4LslsjjfF6XWaGJVCHr6PD/cdP/gw9kAfIg4LlytU
- ap3BGG/mkq0pNpvdbk+nIAUALc2WarVwiQkmg04THRUhk/KTDweuX/tAOGZD9+g1emNC
- kiXFZs/IPObMyobkUBACvFjWcWemIz0t1cqZTQZtzD6+kN86B5fOURj7kFCJVK6I1uhN
- iZZUu8OZlZOX7yooLCwsoqAEgOyky5WXm+3MTLdZuQSDDvBh7cDK9zP4sO1h7MVAr9IY
- 4rkUu+N4Tn5BUXFJaXlF5RkKUqCyoqKstPjUSVde9rF0W7I5jseXSkTCr9nDxpEBvT6e
- s2U4c12Fp8sqq2rO1X3XQEEL1NfV1lSfKS85VZCX5QB8gzZaIZfC4AsOLnxYOfzYRyjV
- ehOX6sjOLyqtOFvb0NjU3HLZ7b5CQQm43ZdbLzU3NtTVVJUVu3KOpVkSDBpVpGx/8L9c
- +EcD4H4JYx+tMyamZGS7isur6843tbjb2q95Oq93UVAC1zs919q/v9La3FhfU1lyMjfT
- xpli1VH84MPS+dIe1j2/7ZVqQ4LF7swvrqhpuNh6td3T1f2jt6eXghToueXtvtHZ0eZu
- Pl97pqQgOyPFHKdVRYaDvcC/fXikSmdMSnXkFgF9s7u986a3t+9u/8AgBSkwcK+/7++3
- uq93tLVcqK0sPuFM4+JjYxRyicjPwg8IDBZJZIoYfbzFftxVWt3QfKWjy9t7d2Dooe/x
- MAUp8Nj36MFg/23vTQ/g15QX5mRYzQaNUh4WKgw6cNjCUSsK41eOOcWRU1hZd9HdccPb
- N/DANzwy+nycghR4Pjry5KeHg3d6uz1tlxqqik8cs3FGnSpSKvZrLwyVRqi0xiSb88Tp
- s+dbf+jy9g0+Gn429mJiamqaghKYmvrHxPjoE9/9/t7ua+7Gc2UFWXZLfGy0gj9s/cy9
- UCyFdW9KtmcVlNU2XfUAve/p8xeTL3+ZnZunoATmZl/NTE2Mjfw0dPdW1w8t9ZVFOQ6r
- Wa9W8Idt4JdvdAIEcM1RxMQmWDNg5TS0tN/svffo6djE9Kv5NwuLSxSUwOLCm9ezM5Pj
- I777fX/zuC9Un87LTE00qKNkEn/2cMUMV/DrPjOvuOqC2+O9MzT8fOLl7OvF5ZXVtxSU
- wOrK8tKvczOTY08f9fd0tTXVlLqcNi6OP2y/Yi8D+0SbM7+kpqmtq3fA9+zF9OybpdW3
- a+sbFJTA+tq71eWF+ZmJ0eH7fd3tl+rKC47bOZNWBfbBB3dOUIhEFqWOg6PWVXquub37
- 9tDw2OQroF/b2NyiIAU2N357u/zr7NTPIw/vej2t9ZWF2enJJh3Yi/zby6M0Ri4tq6C8
- rqXjxzsPR35+Ob+4srax9X57h4IS2H6/tfnb6tJrGHzfvZ5Od0NVUU6GJV6nipB+zV6p
- NXL27MKK7y57vP2+ZxO/vFl+t771fucDBSmws721sbayMDs1NjzY23X1QtWpXIcVLpnf
- socrJtjXuzt7Bh6PTs4urKxtAv3HTxSUwMcPv29vra8uzk2PPxm6faOtsbo4z2FN+BP2
- lQ3u672Dw2NTc4ur61vbQL9LQQl8+vhh558b75Zfz7x4+qDvZlvj2W/YwyvkEIlcqd2b
- ez/2/01BCOzufsLYBwbB6xz4WmtJzyk603ClC+Z+fHp+6e3G1s6HT7uIz6VSENj99F+/
- v99cg7mfGHnQ1/39xRr4cpVi1sdESkOFX75EPkr2LIeG7Flq4nqRPc6LZTXZs9TE9SJ7
- nBfLarJnqYnrRfY4L5bVZM9SE9eL7HFeLKvJnqUmrhfZ47xYVpM9S01cL7LHebGsJnuW
- mrheZI/zYllN9iw1cb3IHufFsprsWWriepE9zotlNdmz1MT1InucF8tqsmepietF9jgv
- ltVkz1IT14vscV4sq8mepSauF9njvFhWkz1LTVwvssd5sawme5aauF5kj/NiWU32LDVx
- vcge58WymuxZauJ6kT3Oi2U12bPUxPUie5wXy2qyZ6mJ60X2OC+W1WTPUhPXi+xxXiyr
- yZ6lJq4X2eO8WFaTPUtNXC+yx3mxrCZ7lpq4XmSP82JZTfYsNXG9yB7nxbKa7Flq4nqR
- Pc6LZTXZs9TE9SJ7nBfLarJnqYnrRfY4L5bVZM9SE9eL7HFeLKvJnqUmrhfZ47xYVpM9
- S01cL7LHebGsJnuWmrheZI/zYllN9iw1cb3IHufFsprsWWriepE9zotlNdmz1MT1Inuc
- F8tqsmepietF9jgvltVkz1IT14vscV4sq8mepSauF9njvFhWkz1LTVwvssd5sawme5aa
- uF5kj/NiWU32LDVxvcge58WymuxZauJ6kT3Oi2U12bPUxPUie5wXy2qyZ6mJ60X2OC+W
- 1WTPUhPXi+xxXiyryZ6lJq4X2eO8WFaTPUtNXC+yx3mxrCZ7lpq4XmSP82JZTfYsNXG9
- yB7nxbKa7Flq4nqRPc6LZTXZs9TE9SJ7nBfLarJnqYnrRfY4L5bVZM9SE9eL7HFeLKvJ
- nqUmrhfZ47xYVpM9S01cL7LHebGsJnuWmrheZI/zYlmNsw8ICpHIlVpTsj27sLLBfb13
- cHhsam5xdX1r+8PHT7ss/2P//3vt7n76sPPPjXfLr2dePH3Qd7Ot8WxxnsOaEBsdIRUF
- Bx498u/5A/tdCkbg08fD2lfUuzt7Bh6PTs4urKxtvt+BwaegBD5++H17a311cW56/MnQ
- 7RttjdV/Yu6NHOyciu8ue7z9vmcTv7xZfre+BfgUpMDO9tbG2srC7NTY8GBv19ULVady
- Hdb4b+2cKI2RS8sqKK9r6fjxzsORn1/OL66sbWy9396hoAS2329t/ra69HpmYtR3r6fT
- 3VBVlJNhidepvrrvZVHquCSb01V6rrm9+/bQ8NjkqzdLq2sbm1sUpMDmxm9vl3+dnfp5
- 5OFdr6e1vrIwOz3ZpFPJw/yftWKZQm1ItDnzS2qa2rp6B3zPXkzPAv7btfUNCkpgfe3d
- 6vLCPIz98P2+7vZLdeUFx+2cSQv2IX7vOeJwsDenZOYVV11we7x3hoafT7ycfb24vLL6
- loISWF1ZXvp1bmZy7Omj/p6utqaaUpfTxsVplGAfdPCOKQgRSxUxsQnWjBy44Le03+y9
- 9+jp2MT0q/k3C4tLFJTA4sKb17Mzk+Mjvvt9f/O4L1SfzstMTTSoo2QSv/ZCsTRSpYMv
- V1kFZbVNVz3evkHf0+cvJl/+Mjs3T0EJzM2+mpmaGBv5aejura4fWuori3IcVrNerQgX
- +7cPlUaotEY4bE+cPnu+9YcuwH80/GzsxcTU1DQFJTA19Y+J8dEnvvv9vd3X3I3nygqy
- 7Ba4YiqkYB9w4HutIFgUJlfyC98BS6fuorvjhrdv4IFveGT0+TgFKfB8dOTJTw8H7/R2
- e9ouNVQVnzhm44w6VaRULPRjHxgsksgUMfp4i/24q7S6oflKR5e39+7A0EPf42EKUuCx
- 79GDwf7b3puetpYLNeWFORlWs4E/akP92geFiMNh4RuTUh25RRU1Dc3u9s6b3t6+u/0D
- gxSkwMC9/r6/3+q+3gH0tZXFJ5xpXHxsjEIuEQULDu6cQLCX8ksnwWJ35hcD/sXWq+2e
- ru4fvT29FKRAzy1v943OjjZ38/naMyUF2Rkp5jitKpI/agUB//4W88iRowFBQlGYTBGt
- MyamZGS7isur6843tbjb2q95Oq93UVAC1zs919q/v9La3FhfU1lyMjfTxpli1VFy/qgN
- 9GMvCIbBj1Cq9SYu1ZGdX1Racba2obGpueWy232FghJwuy+3XmpubKirqSorduUcS7Mk
- GDSqSJlEJPRrD0snFAZfpdHHc7YMZ66r8HRZZVXNubrvGihogfq62prqM+Ulpwryshy2
- ZLNBG63gx97PuoedExjED74c8A3xXIrdcTwnv6CouKS0vKLyDAUpUFlRUVZafOqkKy/7
- WDrQx+lioiKk+2P/5fWeX/gCGHwJ4Edr9KZES6rd4czKyct3FRQWFhZRUAJAdtLlysvN
- dmam26xcgoGnDw+DsYeV48+eH/zQsHB+8vXGhCRLis2ekXnMmZUNyaEgBHixrOPOTEd6
- WqqVM5sMWqCXScWw7QUBB45afu5h8IUh4j18tc5gjDdzydYUm81ut6dTkAKAlmZLtVq4
- xASTQaeJ3qeHbe9v7Hn8QMAXicOk8khltFqnNxhNCebEJI5LTrZQUALJyRzHJZnN8aY4
- vU4To1LIYeGI9jaOn5WzN/iwdWDyJVJZhEKpUmu04G+IM5oohxAwGuMM+lidRh2tUkTK
- pfv0sHEObnv+qxZsncAgWDuhMPqyiEjgj45RwxPQ6ihoAa1Wo1bHRKuUUYoIebhUHBoC
- Uw8b52v2+/jBIXv64XI5+CuiopRKFQUvoAR1RWSEXC6Thklg3wiDvkEPg8/jC/jRB32x
- JEwqDZfJ5JRDCshk4VIpDx8K8vtD/5Wp39s6gL+nD2s/RBQKD0AskUjCKIcQADjg4915
- eJh5ft/4X/af363xow/6MPxw7MID2IuIghb4TCcUBgP83rb5I3r+xOX1AwID9x8A/B7l
- rwgIBHsTz8N/c+g/zz7w7/nzzwACj4FyGIF9Pv7fP+n+v/57fwHwO5S/KPB/QOlHEiAB
- EiABEiABEviPEfgfA0+JGQplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjM4NjUKZW5k
- b2JqCjM2IDAgb2JqCjw8IC9MZW5ndGggMzcgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0
- eXBlIC9JbWFnZSAvV2lkdGggMTI0IC9IZWlnaHQgMTcwIC9Db2xvclNwYWNlCi9EZXZp
- Y2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
- c3RyZWFtCngB7ZxnUyLdFoUnmBMSRCXnKCASREBERJIRcxjHMOH//4S79j5N0ygoAlN1
- 36o+H6YUGR52OHGv01++qE31gOqB/w8PfO2zjfrbSthv3L53beJv0htHx6cPxEczcky0
- 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
- cExpL6NF9wWnbGcp9nN75hQZPrjDO7P9nYTDohF0kLFSEpP2aND9WI41zCP074+PvEgT
- GxIM4sNaTbZ/0NUub24l2T8E/7difUjzxyjQH8FprY5LB2j3d7Qml6au0aA/hGN/dHuH
- Jl+xGJnVH7gds1rznC+Z4GrJefPkkNbEI3L4O9mORRT2KfXDY7pcg4YrNcdAl2itQEcd
- vDzjA6Z+B1IBe/1vt4QTK7h9XO05xqUiXCU6xi6EbxIlYiNEd405LR9pm1St82UqXKGq
- V+keEa2QRmd1j5gDzrvi/WqNbpDVqvti0zlqdDfLaTGR3sJFMtydq1T2y3u4NoadPm05
- RxXrVuzfxtwfjsp39+S7etF/gO5iOZ1GxBO4s5jPb2/ncUswncCRFp2nYYE0ggxvWd0l
- 5nwesYYbk6nNDNpmCrcj18T5wsjRbyy3tG6K0hVVXEqVboXSsnDEVr+ynFavZpvT7Qvg
- Zi7dy8Vt3IDP7bSZeUXK267+1mZK1773syLh+GjZahc3g0MhcQvY3j5MGm406/YlZDjW
- 7TgIgul8I9rrFbefzas4zsHO53Nrs26gbq+14LRj0RqMdBPcbnc4nQ47bDatGOkUC8fF
- o7eavkwHXG8wLtMNeDTcdl82GsTJ4T9Cy3Bsl+jqv7j5v7IibvmLc2psNUebZu0ASJZL
- jzzgJx4YDPx0A+nhBv8O3bacHvXQetKDeKqD/FCHnudIbRMG/Iks/87VK5RT8ISLBTR6
- moUoiAz9RIf3vxXD6XifHu0hHuwBcLsQ1Ov07P1P7fOvgGOPzJW7SfE8E3p8iai+UeGx
- z48Z7G18MkF1LLge5oMLMNJ7+Md39PF9CI6ow3h+kgzVG+V6Zx//fbi3AC7h8Q1E66/M
- OxxW+t9Mpzq11MTvI/nofj5E4Nr/9vN/RvseYo/2E9VPUz2gekD1wH/bA/8DnbcyYgpl
- bmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjM0MDgKZW5kb2JqCjMzIDAgb2JqCjw8IC9M
- ZW5ndGggMzQgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGgg
- MzgwIC9IZWlnaHQgMTUyIC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29t
- 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
- 8lcEhMLoxPPwXxz6T7MP/FF//hlA4DFQdiKwycf/+yfd/+Uf/QuAn6H8RYH/AKX/kgAJ
- kAAJkAAJkMB/jcD/A4a3SRwKZW5kc3RyZWFtCmVuZG9iagozNCAwIG9iagozNDk2CmVu
- ZG9iagozOCAwIG9iago8PCAvTGVuZ3RoIDM5IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0Rl
- dmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtWHk4VV3bX2d0
- zMeQMRzKkHnKPI8ZM2co8xiO4xhCSFGUucyEJIl6lIgGUqbMokSJMkVmIjK9+9DT833X
- 973X+8+7rmvt9Vv3+t2/tfa+z9r3WRsA7EMnAsEHDgDwxQcSzXQ1cNY2tjiyIYACtAAL
- RAHMySWAoG5iYghR/k1ZHwAw0lC/CEkrxyp1IeyFaeVXk6LyQcGy+X/j9LeZhghNCABM
- GDIwehxgNRJ2PsAWJHwukBAIcTxJ2MXTyRXC4RAWJlqYaUK4FMI0Hge4loSdD/AbEg52
- 8SD5DgKApse7euEBIJuDsIqrW4ALNEya19U1wMUXwikQr8/X1w/Sx0IVCLgQiJAvNgHC
- R0nPBWqhYgvpSpVDOsn/2IIhreo4APj8/7HxQhymaQDu8P5jWzXbf1Ywpp4AdynJfTkY
- lQYAqJG9vVU+SPM6ADupe3tbRXt7O7cBQAwD0ODjEkQM3udCC4R1AfCf+gf3/NsDAQUH
- CjDMDr6KDEEtknlhxincKMeoT9H0Y83o2hm0GV8yKTBXswqxFR5m5UjhwuAiuBePuBx9
- x6fDX3kMJ5gotC7iKNosLiyRJLkobXz8nixczk7+oSJSyVK5WGVJTVE9WqNVi0rbWCdR
- t0MPra9uEGr40GjyJKuJoWmYWZn5oCXSSvyUnfUlm3u2vXbrZ9jtlR2cHC863XJucBlx
- 3XJn8ZDyNPbyPHvBO8Pnge9r/Ae/WcIOkTaAK1AsSCXY4Jx1iGsoPizkfFR4XERyZNqF
- 7Ki8i/mXCqNvxdy6XHglPzY3Lutq2rXk+KsJ0YnhSQHJ3inOqdbXjW9opsmlC2fgMhmz
- yLI2s7/nDOd25dXffJB/syC+MOyWR5HlbY1i0TtsJeiS5bufSpvvVZRllUfd93xg8pds
- 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
- Yi8xRBdeFrtSH2d8dSSekAhPSk8RSH1xwzRtKuN8Fja7JFcp722+R8HOreu3+YtflJjc
- nbgXXI65n/3XsYraRzqVfVWnqydqvGsXn/k/X67D1083OLzqb9RqetTC3nrxzVi7WkdO
- 52K3ek9S70Afe7/du6z33R/ggxJDZz5Gf7o73Pp5fGT7C91XnjGJcaUJ7UmDKaNvxtMG
- M7rf1Wbl5kTmcQv0i7DF5aXPy20rj1dv/ohZ8143+Xl8g2MTuTn9q3OrYjtlx2/XeI+P
- FP+D89L+mYJC08/Hj4gz1NTa7/73Lr4+QdA5ar/QQlcqvLPxSailh2pTQLC5NtRCeQsM
- uHvp6P3GU65OWgYQPgzV9TBPTWOopYL+7dK7E3XMIMwEYc6zTvomEKaBsLQb3tIcwpAm
- TIMQqEHisEDYwi1A+2+7T5inxanf/EhvPwMSh6SZ4Oqm9XsNsCy8j7EhZCfpl3oF6u2f
- UyFcD3Sg9yIReAA3IAIMob2iBVkm9i1/9632+15/xg9YIsB93zMY8gwA3mAK8vF18LpE
- hPbcAePgigMuwA8EAR+IFwSI4uXiM+Lbfzia0JgPVP9/r4MRL+AKMf6n2r6dNJdvpXtw
- ll+ogpVn91zN3B/Vg3ty/rNig79nh9aA/2P9P4rAC/qusH+ehp4UQEOxy7MnoQa+QlLz
- v0qgWwh01gZA048QSvTy8AzEqUNfE9yEcXp4F1FhnKS4uDz4FwLFZdwKZW5kc3RyZWFt
- CmVuZG9iagozOSAwIG9iagozODI3CmVuZG9iagoyNCAwIG9iagpbIC9JQ0NCYXNlZCAz
- OCAwIFIgXQplbmRvYmoKNDAgMCBvYmoKPDwgL0xlbmd0aCA0MSAwIFIgL04gMyAvQWx0
- ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
- rVh5OFVd219ndMzHkDEcypB5yjyPGTNnKPMYjuMYQkhRlLnMhCSJepSIBlKmzKJEiTJF
- ZiIyvfvQ0/N91/e91/vPu65r7fVb9/rdv7X2vs/a91kbAOxDJwLBBw4A8MUHEs10NXDW
- NrY4siGAArQAC0QBzMklgKBuYmIIUf5NWR8AMNJQvwhJK8cqdSHshWnlV5Oi8kHBsvl/
- 4/S3mYYITQgATBgyMHocYDUSdj7AFiR8LpAQCHE8SdjF08kVwuEQFiZamGlCuBTCNB4H
- uJaEnQ/wGxIOdvEg+Q4CgKbHu3rhASCbg7CKq1uACzRMmtfVNcDFF8IpEK/P19cP0sdC
- FQi4EIiQLzYBwkdJzwVqoWIL6UqVQzrJ/9iCIa3qOAD4/P+x8UIcpmkA7vD+Y1s1239W
- MKaeAHcpyX05GJUGAKiRvb1VPkjzOgA7qXt7W0V7ezu3AUAMA9Dg4xJEDN7nQguEdQHw
- n/oH9/zbAwEFBwowzA6+igxBLZJ5YcYp3CjHqE/R9GPN6NoZtBlfMikwV7MKsRUeZuVI
- 4cLgIrgXj7gcfcenw195DCeYKLQu4ijaLC4skSS5KG18/J4sXM5O/qEiUslSuVhlSU1R
- PVqjVYtK21gnUbdDD62vbhBq+NBo8iSriaFpmFmZ+aAl0kr8lJ31JZt7tr1262fY7ZUd
- nBwvOt1ybnAZcd1yZ/GQ8jT28jx7wTvD54Hva/wHv1nCDpE2gCtQLEgl2OCcdYhrKD4s
- 5HxUeFxEcmTaheyovIv5lwqjb8Xculx4JT82Ny7ratq15PirCdGJ4UkByd4pzqnW141v
- aKbJpQtn4DIZs8iyNrO/5wznduXV33yQf7MgvjDslkeR5W2NYtE7bCXokuW7n0qb71WU
- ZZVH3fd8YPKXbAXHQ8TD6UddlZWPM6pCq08/Ua3hroXXTjxtelb8POaFS516PVf9zsuh
- hievUl97N2o3cTX9bO5pKWkNf2PWxtf2q72rI78T36XSTdX9saek1/+tYh+yr6v/xjvr
- 9xzvvwwUfXAe5Bn8OpT/0fYT06fe4auf1T9vjlSMun5h/dL1NWpMcmxiPH1Ce2J98s6U
- xTfkt8fTzjN0Mw3fCbO42d65i/OS8xMLWYuGS7ClmmX8Cv/K19W8HzZrzGsD65k/bTc4
- NsY2S38RtuS24dsdOxm7Tntie3u/42+HGiSzwvRRnKCsp5amKcdy02Uw0DPGHNpixrNM
- sFmwt3AocN7HHea+xvPrqDtvL7+iQJEgRshXuEdUUixVfEFSR6pAel1GTzZXbkZBRjFS
- qUWFQtVILUm9U5NcS1P7vM5D3Uk9Fn09gxDDEqN+4x0TflNTsxDzmxavLb+dorAWsTlp
- i7dLOv3gTIf9tCPKidtZ0cXKFe8W657vUe3Z4TV6dtWHzJcVL+inSND3tya6BwQEXgi6
- Fpx2Li+kOLQ87NH5mvDnES8jX114HdV4sfFSY/SrmJeX6648ja2Kq7hadu1OfH5CZmJK
- UlzyhZTgVJ/rLjds0ozTNTPkMkWyeLKZcshzdnKX8sZuvstvKagtLLuVW5RwO7zY987p
- EsO7iqWC99jKMGXr5RP3+x68/Ot+Rc7DK48CKh0eG1TJVvM8oX6yWTNe2/209lnR84QX
- QXX29bovxRqYG3ZfTb3uanzclN0c2eLSqvtGqI2mbbm9v6OqM70rsNu8R7IX2zv39k3f
- 7f5IKPriA5iBLx+eDMYPOXyU+oT+NDh873PoiN4o8+jkl8qvkWN644zjIxN3JwlTslO7
- 35qm42YMv2O/v529Pmc2TzffvXBtUXtxd6l6+ewK50rvatQP0R8f16LXBdd7fvpv0G9U
- bOpvTvwK28JuFW1LbzfumO6M7p7dXdsL248/Ai6MUEVaojzRkWQZmHvkdRQDlLPUcBpG
- Wn6sEp0pvTNDEGPsoWymcuZnLO2sQ2zf2Nc54JwUXEw4Lm5eHqEjokfFeSX4JPhFBQSP
- 8QlyCDEIY4R/icyKfhJrFa+UyJO8LOUjbXZcRoZZZkN2UK5WPl2BqGisJKiMUh5RqVVN
- VfNS19Bg01jRbNcq0g7TMdMVPAE/8VHvkf41AxdDRSNGo3njlpOFJqGm5mYi5mjzLxZP
- LdOs8KdOWPNYb9sM2D60u3ba7YyyPbP9skO7422ncGcrF1FXMtdRtxr3JA93T2UvRq/Z
- s6+9s3zwvlp4VvyCXxMhy9+XqBbAGDAd+DwoMdjxnGQIMmQgtDQs9Lx+OHv4XMSLyMQL
- Z6JEo3Yv9lwqiCbEqF+mvzx+pSo2Ns76quDVnWtv44sTQhINk7iT1pM7U4pSQ6+b3BBI
- A2lD6ZUZCZnuWerZh7M3ct7nPspLvumbb1AgWEhR+P1WZ9GD28nFxDtWJQp3uUpRpbP3
- +suelxffT3oQ+pdbhdlDtUdilVyP6aqQVRvVC08maz7Xfnja/6z3ee+LvrqB+uGXkw3L
- r/YasU28zcotNq0hb/LamtpXO3m77Lvzer68FeqL6H//Xm6gcJBuKP4T9XDmiPBo21e/
- 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
- IWQn6Zd6Bertn1MhXA90oPciEXgANyACDKG9ogVZJvYtf/et9vtef8YPWCLAfd8zGPIM
- AN5gCvLxdfC6RIT23AHj4IoDLsAPBAEfiBcEiOLl4jPi2384mtCYD1T/f6+DES/gCjH+
- p9q+nTSXb6V7cJZfqIKVZ/dczdwf1YN7cv6zYoO/Z4fWgP9j/T+KwAv6rrB/noaeFEBD
- scuzJ6EGvkJS879KoFsIdNYGQNOPEEr08vAMxKlDXxPchHF6eBdRYZykuLg8+BcCxWXc
- CmVuZHN0cmVhbQplbmRvYmoKNDEgMCBvYmoKMzgyNwplbmRvYmoKMzAgMCBvYmoKWyAv
- SUNDQmFzZWQgNDAgMCBSIF0KZW5kb2JqCjQyIDAgb2JqCjw8IC9MZW5ndGggNDMgMCBS
- IC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
- CnN0cmVhbQp4Aa1YeThVXdtfZ3TMx5AxHMqQeco8jxkzZyjzGI7jGEJIUZS5zIQkiXqU
- iAZSpsyiRIkyRWYiMr370NPzfdf3vdf7z7uua+31W/f63b+19r7P2vdZGwDsQycCwQcO
- APDFBxLNdDVw1ja2OLIhgAK0AAtEAczJJYCgbmJiCFH+TVkfADDSUL8ISSvHKnUh7IVp
- 5VeTovJBwbL5f+P0t5mGCE0IAEwYMjB6HGA1EnY+wBYkfC6QEAhxPEnYxdPJFcLhEBYm
- WphpQrgUwjQeB7iWhJ0P8BsSDnbxIPkOAoCmx7t64QEgm4OwiqtbgAs0TJrX1TXAxRfC
- KRCvz9fXD9LHQhUIuBCIkC82AcJHSc8FaqFiC+lKlUM6yf/YgiGt6jgA+Pz/sfFCHKZp
- AO7w/mNbNdt/VjCmngB3Kcl9ORiVBgCokb29VT5I8zoAO6l7e1tFe3s7twFADAPQ4OMS
- RAze50ILhHUB8J/6B/f82wMBBQcKMMwOvooMQS2SeWHGKdwox6hP0fRjzejaGbQZXzIp
- MFezCrEVHmblSOHC4CK4F4+4HH3Hp8NfeQwnmCi0LuIo2iwuLJEkuShtfPyeLFzOTv6h
- IlLJUrlYZUlNUT1ao1WLSttYJ1G3Qw+tr24QavjQaPIkq4mhaZhZmfmgJdJK/JSd9SWb
- e7a9dutn2O2VHZwcLzrdcm5wGXHdcmfxkPI09vI8e8E7w+eB72v8B79Zwg6RNoArUCxI
- JdjgnHWIayg+LOR8VHhcRHJk2oXsqLyL+ZcKo2/F3LpceCU/Njcu62rateT4qwnRieFJ
- AcneKc6p1teNb2imyaULZ+AyGbPIsjazv+cM53bl1d98kH+zIL4w7JZHkeVtjWLRO2wl
- 6JLlu59Km+9VlGWVR933fGDyl2wFx0PEw+lHXZWVjzOqQqtPP1Gt4a6F1048bXpW/Dzm
- hUudej1X/c7LoYYnr1JfezdqN3E1/WzuaSlpDX9j1sbX9qu9qyO/E9+l0k3V/bGnpNf/
- rWIfsq+r/8Y76/cc778MFH1wHuQZ/DqU/9H2E9On3uGrn9U/b45UjLp+Yf3S9TVqTHJs
- Yjx9QntiffLOlMU35LfH084zdDMN3wmzuNneuYvzkvMTC1mLhkuwpZpl/Ar/ytfVvB82
- a8xrA+uZP203ODbGNkt/EbbktuHbHTsZu057Ynt7v+Nvhxoks8L0UZygrKeWpinHctNl
- MNAzxhzaYsazTLBZsLdwKHDexx3mvsbz66g7by+/okCRIEbIV7hHVFIsVXxBUkeqQHpd
- Rk82V25GQUYxUqlFhULVSC1JvVOTXEtT+7zOQ91JPRZ9PYMQwxKjfuMdE35TU7MQ85sW
- ry2/naKwFrE5aYu3Szr94EyH/bQjyonbWdHFyhXvFuue71Ht2eE1enbVh8yXFS/op0jQ
- 97cmugcEBF4Iuhacdi4vpDi0POzR+Zrw5xEvI19deB3VeLHxUmP0q5iXl+uuPI2tiqu4
- WnbtTnx+QmZiSlJc8oWU4FSf6y43bNKM0zUz5DJFsniymXLIc3Zyl/LGbr7LbymoLSy7
- lVuUcDu82PfO6RLDu4qlgvfYyjBl6+UT9/sevPzrfkXOwyuPAiodHhtUyVbzPKF+slkz
- Xtv9tPZZ0fOEF0F19vW6L8UamBt2X0297mp83JTdHNni0qr7RqiNpm25vb+jqjO9K7Db
- vEeyF9s79/ZN3+3+SCj64gOYgS8fngzGDzl8lPqE/jQ4fO9z6IjeKPPo5JfKr5FjeuOM
- 4yMTdycJU7JTu9+apuNmDL9jv7+dvT5nNk83371wbVF7cXepevnsCudK72rUD9EfH9ei
- 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
- Cv/K19W8HzZrzGsD65k/bTc4NsY2S38RtuS24dsdOxm7Tntie3u/42+HGiSzwvRRnKCs
- p5amKcdy02Uw0DPGHNpixrNMsFmwt3AocN7HHea+xvPrqDtvL7+iQJEgRshXuEdUUixV
- fEFSR6pAel1GTzZXbkZBRjFSqUWFQtVILUm9U5NcS1P7vM5D3Uk9Fn09gxDDEqN+4x0T
- flNTsxDzmxavLb+dorAWsTlpi7dLOv3gTIf9tCPKidtZ0cXKFe8W657vUe3Z4TV6dtWH
- zJcVL+inSND3tya6BwQEXgi6Fpx2Li+kOLQ87NH5mvDnES8jX114HdV4sfFSY/SrmJeX
- 6648ja2Kq7hadu1OfH5CZmJKUlzyhZTgVJ/rLjds0ozTNTPkMkWyeLKZcshzdnKX8sZu
- vstvKagtLLuVW5RwO7zY987pEsO7iqWC99jKMGXr5RP3+x68/Ot+Rc7DK48CKh0eG1TJ
- VvM8oX6yWTNe2/209lnR84QXQXX29bovxRqYG3ZfTb3uanzclN0c2eLSqvtGqI2mbbm9
- v6OqM70rsNu8R7IX2zv39k3f7f5IKPriA5iBLx+eDMYPOXyU+oT+NDh873PoiN4o8+jk
- l8qvkWN644zjIxN3JwlTslO735qm42YMv2O/v529Pmc2TzffvXBtUXtxd6l6+ewK50rv
- atQP0R8f16LXBdd7fvpv0G9UbOpvTvwK28JuFW1LbzfumO6M7p7dXdsL248/Ai6MUEVa
- ojzRkWQZmHvkdRQDlLPUcBpGWn6sEp0pvTNDEGPsoWymcuZnLO2sQ2zf2Nc54JwUXEw4
- Lm5eHqEjokfFeSX4JPhFBQSP8QlyCDEIY4R/icyKfhJrFa+UyJO8LOUjbXZcRoZZZkN2
- UK5WPl2BqGisJKiMUh5RqVVNVfNS19Bg01jRbNcq0g7TMdMVPAE/8VHvkf41AxdDRSNG
- o3njlpOFJqGm5mYi5mjzLxZPLdOs8KdOWPNYb9sM2D60u3ba7YyyPbP9skO7422ncGcr
- F1FXMtdRtxr3JA93T2UvRq/Zs6+9s3zwvlp4VvyCXxMhy9+XqBbAGDAd+DwoMdjxnGQI
- MmQgtDQs9Lx+OHv4XMSLyMQLZ6JEo3Yv9lwqiCbEqF+mvzx+pSo2Ns76quDVnWtv44sT
- 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
- b/6IWfNeN/l5fINjE7k5/atzq2I7Zcdv13iPjxT/g/PS/pmCQtPPx4+IM9TU2u/+9y6+
- PkHQOWq/0EJXKryz8UmopYdqU0CwuTbUQnkLDLh76ej9xlOuTloGED4M1fUwT01jqKWC
- /u3SuxN1zCDMBGHOs076JhCmgbC0G97SHMKQJkyDEKhB4rBA2MItQPtvu0+Yp8Wp3/xI
- bz8DEoekmeDqpvV7DbAsvI+xIWQn6Zd6Bertn1MhXA90oPciEXgANyACDKG9ogVZJvYt
- f/et9vtef8YPWCLAfd8zGPIMAN5gCvLxdfC6RIT23AHj4IoDLsAPBAEfiBcEiOLl4jPi
- 2384mtCYD1T/f6+DES/gCjH+p9q+nTSXb6V7cJZfqIKVZ/dczdwf1YN7cv6zYoO/Z4fW
- gP9j/T+KwAv6rrB/noaeFEBDscuzJ6EGvkJS879KoFsIdNYGQNOPEEr08vAMxKlDXxPc
- hHF6eBdRYZykuLg8+BcCxWXcCmVuZHN0cmVhbQplbmRvYmoKNDcgMCBvYmoKMzgyNwpl
- bmRvYmoKMjcgMCBvYmoKWyAvSUNDQmFzZWQgNDYgMCBSIF0KZW5kb2JqCjQ4IDAgb2Jq
- Cjw8IC9MZW5ndGggNDkgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0
- ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYWUTUgUYRjH/7ONBLEG0ZcIxdDBJFQm
- C1IC0/UrU7Zl1UwJYp19d50cZ6eZ3S1FIoTomHWMLlZEh4hO4aFDpzpEBJl1iaCjRRAF
- XiK2/zuTu2NUvjAzv3me//t8vcMAVY9SjmNFNGDKzrvJ3ph2enRM2/waVahGFFwpw3M6
- EokBn6mVz/Vr9S0UaVlqlLHW+zZ8q3aZEFA0KndkAz4seTzg45Iv5J08NWckGxOpNNkh
- N7hDyU7yLfLWbIjHQ5wWngFUtVOTMxyXcSI7yC1FIytjPiDrdtq0ye+lPe0ZU9Sw38g3
- OQvauPL9QNseYNOLim3MAx7cA3bXVWz1NcDOEWDxUMX2PenPR9n1ysscavbDKdEYa/pQ
- Kn2vAzbfAH5eL5V+3C6Vft5hDtbx1DIKbtHXsjDlJRDUG+xm/OQa/YuDnnxVC7DAOY5s
- AfqvADc/AvsfAtsfA4lqYKgVkctsN7jy4iLnAnTmnGnXzE7ktWZdP6J18GiF1mcbTQ1a
- yrI03+VprvCEWxTpJkxZBc7ZX9t4jwp7eJBP9he5JLzu36zMpVNdnCWa2NantOjqJjeQ
- 72fMnj5yPa/3GbdnOGDlgJnvGwo4csq24jwXqYnU2OPxk2TGV1QnH5PzkDznFQdlTN9+
- LnUiQa6lPTmZ65eaXdzbPjMxxDOSrFgzE53x3/zGLSRl3n3U3HUs/5tnbZFnGIUFARM2
- 7zY0JNGLGBrhwEUOGXpMKkxapV/QasLD5F+VFhLlXRYVvVjhnhV/z3kUuFvGP4VYHHMN
- 5Qia/k7/oi/rC/pd/fN8baG+4plzz5rGq2tfGVdmltXIuEGNMr6sKYhvsNoOei1kaZ3i
- FfTklfWN4eoy9nxt2aPJHOJqfDXUpQhlasQ448muZfdFssU34edby/av6VH7fPZJTSXX
- srp4Zin6fDZcDWv/s6tg0rKr8OSNkC48a6HuVQ+qfWqL2gpNPaa2q21qF9+OqgPlHcOc
- lYkLrNtl9Sn2YGOa3spJV2aL4N/CL4b/pV5hC9c0NPkPTbi5jGkJ3xHcNnCHlP/DX7MD
- Dd4KZW5kc3RyZWFtCmVuZG9iago0OSAwIG9iago3OTIKZW5kb2JqCjcgMCBvYmoKWyAv
- SUNDQmFzZWQgNDggMCBSIF0KZW5kb2JqCjIyIDAgb2JqCjw8IC9MZW5ndGggNTAgMCBS
- IC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9E
- b21haW4KWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRl
- RGVjb2RlID4+CnN0cmVhbQp4AbXCB3vhYAAA4H9Ye4Qkduy9iXE/7zqvNtXWbI0WrdnF
- PfJwhCQ+iXufd/Ersfg3mVhsxhfJ1XkyfvREfL4ZmydiP6zHYz/r33Gc/Rj+HcO/SKNf
- MTY/8ejeyCd+3A88shzdH/6Igp5Fw6uR8IxiaBY5fBoJkYZDU4rBaZjpJBzcHQpOqAcm
- IerjUIB6MDCm7h8HSUdB/4EB/4i6bxRYHQZ8h/t9Q9reod/7Dt7nfaf55vMc0et5ozrw
- eojugRe4xz0g73vcW119D3C3q7/ec7v2OntusC5nz+V8Zep4dQF9cToA2l+cTLtOe9cB
- 2NZ1UO84bKt2WweotWPf3bZbSW3WNlBL27bZsll2Wy0t0OaWdfmZrsX8DPbJYmJqNj0B
- bJpNRGPTTN9kbDJumIxbsYaJvhFrMK4bMZqGupExZqjTrGEGxvoaxtigr+2tGvRgdVUD
- fb2uul7R646srehp6rQV4qNOy6rmUUdTq3ngWv2gJb3Xqpc13KvuNatljWpTrSpzjZbV
- 6N1OFXrHbUmFEpGSihxFSmwXUWQrXETJEbh4/AIC71UWEHJYWQCeh5WMFXl4q1KRB5hT
- KgBCOeW6AsodmlVAwOVZxTokz9LMQHJWZRmIKJdl9qblMg6laTlRJk1vTcmknEtSMqJU
- kpJKbk9cfCsR//kPbySiG/EpX4tF68Jr0WleiYS7hYIrbi+FAuoC/iWrFwI+Uz7/gs87
- 9jmfdziPd758Bvg37wzwX0ZZ9gAKZW5kc3RyZWFtCmVuZG9iago1MCAwIG9iago1NjQK
- ZW5kb2JqCjIzIDAgb2JqCjw8IC9MZW5ndGggNTEgMCBSIC9GdW5jdGlvblR5cGUgMCAv
- Qml0c1BlclNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFu
- Z2UgWyAwIDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
- AbXCB3vhYAAA4H9Ye4Qkduy9iXE/7zqvNtXWbI0WrdnFPfJwhCQ+iXufd/Ersfg3mVhs
- xhfJ1XkyfvREfL4ZmydiP6zHYz/r33Gc/Rj+HcO/SKNfMTY/8ejeyCd+3A88shzdH/6I
- gp5Fw6uR8IxiaBY5fBoJkYZDU4rBaZjpJBzcHQpOqAcmIerjUIB6MDCm7h8HSUdB/4EB
- /4i6bxRYHQZ8h/t9Q9reod/7Dt7nfaf55vMc0et5ozrweojugRe4xz0g73vcW119D3C3
- q7/ec7v2OntusC5nz+V8Zep4dQF9cToA2l+cTLtOe9cB2NZ1UO84bKt2WweotWPf3bZb
- SW3WNlBL27bZsll2Wy0t0OaWdfmZrsX8DPbJYmJqNj0BbJpNRGPTTN9kbDJumIxbsYaJ
- vhFrMK4bMZqGupExZqjTrGEGxvoaxtigr+2tGvRgdVUDfb2uul7R646srehp6rQV4qNO
- y6rmUUdTq3ngWv2gJb3Xqpc13KvuNatljWpTrSpzjZbV6N1OFXrHbUmFEpGSihxFSmwX
- UWQrXETJEbh4/AIC71UWEHJYWQCeh5WMFXl4q1KRB5hTKgBCOeW6AsodmlVAwOVZxTok
- z9LMQHJWZRmIKJdl9qblMg6laTlRJk1vTcmknEtSMqJUkpJKbk9cfCsR//kPbySiG/Ep
- X4tF68Jr0WleiYS7hYIrbi+FAuoC/iWrFwI+Uz7/gs879jmfdziPd758Bvg37wzwX0ZZ
- 9gAKZW5kc3RyZWFtCmVuZG9iago1MSAwIG9iago1NjQKZW5kb2JqCjMgMCBvYmoKPDwg
- L1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdIC9Db3VudCAxIC9LaWRz
- IFsgMiAwIFIgXSA+PgplbmRvYmoKNTIgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1Bh
- Z2VzIDMgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjUzIDAgb2JqCjw8IC9MZW5n
- dGggNTQgMCBSIC9MZW5ndGgxIDEwMjg4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
- cmVhbQp4Ab1aeXxU1fU/9+2zZDIzmcnsmZlMZiaTfSEJQ0IyhqwsMSQCCRJMAoGAUBFj
- NCo0KhSJiguCCP3Z4sIqMoQIExB/aFHEWvfiUtvaitb203xsfz9trSQzv3PfhAhd/PGH
- H+fN3e+775zvPefcc+97QABADf3AQmjRyo5VzY0VtVjzKgDRL+rtcd37x/JHMf8RALti
- yaqlK3Uf/ewVAH4mgFK9dEXfkp0FqocAElsAkvq7uzoW//X0U3MAUt/DMYq7sUKZKuYB
- eLRYTute2XPzwnNiMZYnYbl9xXWLOsrSS3AsD44BBSs7bl4l3ab8B5ZfxrLrBx0ruxqX
- 3bYey59hOXXVdTf0sPPYMziUGstNq1Z3rXr2zh/kY7kd6Xsd6whe9IftRJBz3xrFO39r
- l29rZBA1jhdESaEElTpBk6gFnT7JAEaA5G+77ztqM13GOPxJ0PInIJ3vByuXC06A2PsY
- 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
- PsXtsyx6E+uxzrNxv/GJa3mzQ2vT3vUgqspw8Q6GfY5lDq4e20b1ojL2LnuEm4Frby7J
- Cd03WbGN36p/xLDNuC1DSE/z+ovdNe7atFr/3LR5/iVpS3196r6EPk2vpyetx9vj25Wy
- JyuJRVeIz+ZyksBqtJnsZmO2ISc9UbVM8nmLvYw3NUHJZSaZX7I7kkTOkbM9U5UrKjRa
- RoRcd67VaU42+03l6T7Rn27N1zj92nLw51jy8gcn/Dc0IfH1O6jFHGU3mIsxqhydY7qT
- oiblelmSZ5Jsxmf0Wn1ujdMNCp/oJmwW7sX4DMw59FhnM5jdxJWY6gZ3qiZB8ivdxOdV
- KEk25wYhgFGKzu4mlmSMZDdO3gDIkSwiFwQft1pJ8jIvi0sudd1wC0VXRtETd+Oo+DgJ
- 9fYMKDg+P/lc8lbtWbxtqv+G+zZe0fOr4f+5dhqzj/eVP7JkWXV6w00vVC57/zefnxbJ
- UdI4P2/evKur09DzTc2ov33bs5vmd08tqG0I1WRYkhy5WdUP3ffG+z9l/oGyZIp9zij4
- +Wgdmp5JyFGe1JAIqQh5ueSgiRU0Sp0VzTW+OQuAUWNMZJ0sw44mWyxW9O3Gd09jl/p2
- uXHnbkQ7dk5ePKhHR/Xgwn7RV0Tduz1H9u/3GfMTUgzOaf618x94gJ8f/eXmserJSSrC
- bFJIty9lXtyM6w0D/bGP2d+gPpuQwoWhKRHDywZGkSQZLEkWQ7pwE/suLrbAa5QgJCh5
- tF1m0WzGLVmOMqBWWa0kQIl964I3MIsaLyr+OP1xP66ijAoEFX3SRuKEooNFNzElsl+N
- s6LzksnWvDufrfIO7WM8k5Zu/qQ5mxzkcseCTZPa98z/L0Zz/s1Hp2Zc9UjTRuY9K9VP
- Pb7n38nlgpq4QmtruX0KZInUiPWqDeyAtF75CnOKfUk8I72kPKNSLRGXS13KZapesU/q
- Vfap1osDKiXty9SyN8HNPDsvPTkdd1tcKSnl7iP3cYKCI6yKQedCzYMgKVWsqNTgJIm8
- sENiuVNKRnFKBWSH2pJA3W90Kr4wzxoLBif+Fnk9RUcDF1RTGUp+24zZfSE1H9AjxxDQ
- q9UqfoM2E/8zmvqGFPjuTRkhd4eS9LjdFQWOpx0FUYGv7iVar9FzuAlWI9vyrYR6LBu0
- a06ZeeqyoO/yopzZsEZ7aqKGui/XX389ejA2ptBGColHhT7Mu6+9+cpbvxqKnjn+wdvH
- oz/nckeH2Jmjw2zt+TfZqaM/Q0BRHvD7B3YI5UEBSlgRqiwR6mAetJB5wlLoJkuFm3gF
- 4QUhgFNAlEoi4GaMMEH0vkAUgkiyUuTLRauanQ4WlXpwYlGTTT5ugCtwNxeUI2oR0U5s
- QGbWvEjpLSFuPBQibqObTGJuHRtiy8c2MgOj/eT1TSzs3DyGM16P6y3uk9ib5X2SDfck
- HaFi2ycW+Ga/5MANk1OndOOE2VICZue/bJtc7rfcS8d35hOqdRbJGveC0DmkziLdPFWM
- kP+8f/IWFRpFFON/2UcxSUP4+9fdlPPVV0+fPyv7eBjhRyUDr9Vek1j2JegkufxSxaEn
- aSaeRksFL3IJOA94jib/MBUC0QB+QkK+6hodUT0w0TLeAcy8HiqZIHrDN8ihiQMoxfxk
- DHVYb8d0KoZ15DSsw7Z+TDcK+zCPdRho315mH2zENjqOCcv9+B2GHsuTMCD2KB+ToA7f
- qj+E781fYZPZ5zgNV8Y9xb3GT+d3CSnC/cJZ8YgkSO0KjWKh4iTeQek34/t6Fq7F00MG
- tHi1AYifKdX4nQZtpRod51LANpjeMqOypSazrmtFb1fPskUd2IPBgD88S8QDw3/zM2Md
- i+eaVVAjfwtRD9PlLx4a4Er5m4wm/M5iDsylogzz8eknAT8Qoeee9RgqMBRhyMy8woyY
- 7IL7MfwUAwvLyN3Qh2EjhkcwcBO5vVgaJncPclLoGOkDK5keUnHOqwwWp1mpcr6F7ujQ
- o873zR8fJxZIgN8Ry2ACKK5Qkp+Sn8BicJIn8eTlFvxqI51sPxxY4WzHpr2wCkM/BlaO
- Cdk7mFLgfI5kgZcjeI8PUjhyxPmH/GznJ/kRhgw6X/BHOEyeT8FSKNF50vGo878dS53P
- Ydgfb9oXwB5HnHsdK5ybUyJk+6DzQbopGHQ+EE9udOCtR5wrA1udi/Pl9plbI8z+QWcQ
- 2+eGVM7iyW5nkeOcM9cfkQiWsx0znRn5v3Cm4Y3YzYWDekM6p92x2TkFm1Ic1f4pGI6T
- fWQHZJAdg97pzmOYRXYP1wcmb42QWw/Xped7I+SWUHFd+tZAnd8bmOn0Bmr8fszPfVlc
- J14tXiEWiJn44QQ6CKJNNEh6SStpJLWklHDrFyFPDVY4heNkP1QgLPsPo7zxEfI0VnLH
- yQG58sBRiZMYCSRDJPbREJUx3BLtH0LxIoCZI4KcEyLkAJ5V06oDISeKOAFObtCixBFZ
- 7FAwGSIxKFBhcm9EgPXJvRXmCn25LlhT9Z+idrnlQiy7JP8+MhNHeCu+Iw3vc7Ti62jM
- xBytF7ri2c7/8+u5ETt0VWbSleRw76rlS+TX657qrnZ8yx6+uxc/d+jvdLkOLV81/u2A
- r71zUTd9v9vRFV7l6aoKL/dUuQ71yvfR6oual9DmXk/VIVhSfVXLoSWhrqrB3lBvNf3M
- 4HBn5eq2S561ceJZqyv/zbMq6WCr6bM65fv+6VlttLmTPquNPquNPqsz1Ck/i0JQvay5
- 8oYelE58BY+vwNObw/Wz57fglyatVRGyi76XvxH+DxXtA6oKZW5kc3RyZWFtCmVuZG9i
- ago1NCAwIG9iago2NzYyCmVuZG9iago1NSAwIG9iago8PCAvVHlwZSAvRm9udERlc2Ny
- aXB0b3IgL0FzY2VudCA3NzAgL0NhcEhlaWdodCA3MjcgL0Rlc2NlbnQgLTIzMCAvRmxh
- Z3MgMzIKL0ZvbnRCQm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL0pY
- S0JYRitIZWx2ZXRpY2EgL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDk4IC9NYXhXaWR0aCAx
- NTAwIC9TdGVtSCA4NSAvWEhlaWdodCA1MzEgL0ZvbnRGaWxlMiA1MyAwIFIgPj4KZW5k
- b2JqCjU2IDAgb2JqClsgMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCA1NTYg
- MCA1MDAgNTU2CjU1NiAyNzggNTU2IDU1NiAyMjIgMCA1MDAgMjIyIDgzMyA1NTYgNTU2
- IDU1NiAwIDMzMyA1MDAgMjc4IDU1NiAwIDcyMiAwIDAKNTAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
- IDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDUwMCBdCmVuZG9iagoxOSAwIG9i
- ago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9KWEtC
- WEYrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgo1NSAwIFIgL1dpZHRocyA1NiAwIFIg
- L0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIgMjIyIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNv
- ZGluZwo+PgplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgKFVudGl0bGVkKSAvQXV0aG9y
- IChBcnZpZCBOb3JiZXJnKSAvQ3JlYXRvciAoT21uaUdyYWZmbGUpIC9Qcm9kdWNlcgoo
- TWFjIE9TIFggMTAuNS43IFF1YXJ0eiBQREZDb250ZXh0KSAvQ3JlYXRpb25EYXRlIChE
- OjIwMDkwNTI1MDIyMzMzWjAwJzAwJykKL01vZERhdGUgKEQ6MjAwOTA1MjUwMjIzMzNa
- MDAnMDAnKSA+PgplbmRvYmoKeHJlZgowIDU3CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAw
- MDA1MTUyNSAwMDAwMCBuIAowMDAwMDAxMDM2IDAwMDAwIG4gCjAwMDAwNDM2NDUgMDAw
- MDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAxMDE3IDAwMDAwIG4gCjAwMDAw
- MDExNDAgMDAwMDAgbiAKMDAwMDA0MjExNSAwMDAwMCBuIAowMDAwMDA0Mjk3IDAwMDAw
- IG4gCjAwMDAwMDUyNTcgMDAwMDAgbiAKMDAwMDAwMTY4NCAwMDAwMCBuIAowMDAwMDAy
- ODI1IDAwMDAwIG4gCjAwMDAwMDUyNzYgMDAwMDAgbiAKMDAwMDAwNTc1OCAwMDAwMCBu
- IAowMDAwMDAyODQ1IDAwMDAwIG4gCjAwMDAwMDM4MDcgMDAwMDAgbiAKMDAwMDAwMzgy
- NyAwMDAwMCBuIAowMDAwMDA0Mjc3IDAwMDAwIG4gCjAwMDAwMzcxNzUgMDAwMDAgbiAK
- MDAwMDA1MTM1MCAwMDAwMCBuIAowMDAwMDAxMzg4IDAwMDAwIG4gCjAwMDAwMDE1Mzkg
- MDAwMDAgbiAKMDAwMDA0MjE1MSAwMDAwMCBuIAowMDAwMDQyODk4IDAwMDAwIG4gCjAw
- MDAwMjgzMzQgMDAwMDAgbiAKMDAwMDAxMzAyOSAwMDAwMCBuIAowMDAwMDE3MDY4IDAw
- MDAwIG4gCjAwMDAwNDExNjMgMDAwMDAgbiAKMDAwMDAwOTMzOCAwMDAwMCBuIAowMDAw
- MDEzMDA4IDAwMDAwIG4gCjAwMDAwMzIzMjIgMDAwMDAgbiAKMDAwMDAwNTc3OCAwMDAw
- MCBuIAowMDAwMDA5MzE3IDAwMDAwIG4gCjAwMDAwMjA2OTIgMDAwMDAgbiAKMDAwMDAy
- NDM2MiAwMDAwMCBuIAowMDAwMDM2MzEwIDAwMDAwIG4gCjAwMDAwMTcwODkgMDAwMDAg
- biAKMDAwMDAyMDY3MSAwMDAwMCBuIAowMDAwMDI0MzgzIDAwMDAwIG4gCjAwMDAwMjgz
- MTMgMDAwMDAgbiAKMDAwMDAyODM3MSAwMDAwMCBuIAowMDAwMDMyMzAxIDAwMDAwIG4g
- CjAwMDAwMzIzNTkgMDAwMDAgbiAKMDAwMDAzNjI4OSAwMDAwMCBuIAowMDAwMDM2MzQ3
- IDAwMDAwIG4gCjAwMDAwMzcxNTUgMDAwMDAgbiAKMDAwMDAzNzIxMiAwMDAwMCBuIAow
- MDAwMDQxMTQyIDAwMDAwIG4gCjAwMDAwNDEyMDAgMDAwMDAgbiAKMDAwMDA0MjA5NSAw
- MDAwMCBuIAowMDAwMDQyODc4IDAwMDAwIG4gCjAwMDAwNDM2MjUgMDAwMDAgbiAKMDAw
- MDA0MzcyOCAwMDAwMCBuIAowMDAwMDQzNzkyIDAwMDAwIG4gCjAwMDAwNTA2NDUgMDAw
- MDAgbiAKMDAwMDA1MDY2NiAwMDAwMCBuIAowMDAwMDUwOTAyIDAwMDAwIG4gCnRyYWls
- ZXIKPDwgL1NpemUgNTcgL1Jvb3QgNTIgMCBSIC9JbmZvIDEgMCBSIC9JRCBbIDwzODUz
- YzMzYzE5YWFhMzMxNDMzNDNmYmUyZDRkYzQ1Mz4KPDM4NTNjMzNjMTlhYWEzMzE0MzM0
- M2ZiZTJkNGRjNDUzPiBdID4+CnN0YXJ0eHJlZgo1MTczMgolJUVPRgoxIDAgb2JqCjw8
- L0F1dGhvciAoQXJ2aWQgTm9yYmVyZykvQ3JlYXRpb25EYXRlIChEOjIwMDkwNTI1MDEz
- ODAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgNS4xLjEpL01vZERhdGUgKEQ6MjAwOTA1
- MjUwMjIzMDBaKS9Qcm9kdWNlciAoTWFjIE9TIFggMTAuNS43IFF1YXJ0eiBQREZDb250
- ZXh0KS9UaXRsZSAoc3RvcmFnZS5ncmFmZmxlKT4+CmVuZG9iagp4cmVmCjEgMQowMDAw
- MDUzMDMwIDAwMDAwIG4gCnRyYWlsZXIKPDwvSUQgWzwzODUzYzMzYzE5YWFhMzMxNDMz
- NDNmYmUyZDRkYzQ1Mz4gPDM4NTNjMzNjMTlhYWEzMzE0MzM0M2ZiZTJkNGRjNDUzPl0g
- L0luZm8gMSAwIFIgL1ByZXYgNTE3MzIgL1Jvb3QgNTIgMCBSIC9TaXplIDU3Pj4Kc3Rh
- cnR4cmVmCjUzMjMxCiUlRU9GCg==
-
- QuickLookThumbnail
-
- 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
- UgABAAAAARbPc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAA
- wGxjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAGN1cnYAAAAAAAAAAQHNAAB2
- Y2d0AAAAAAAAAAAAAwEAAAIAAAFbAvMEeAXvB2kI4wplC+INVw7TEFIRyhNFFL8WOhe1
- GSsaoBwZHZAfCCB9Ie8jYyTUJkYnsikgKo0r9i1gLsUwLDGOMu80TjWpNwI4WzmwOwQ8
- VT2kPvBAO0GDQsdEDEVORo1Hy0kGSkFLeUywTeVPGVBMUXpSqlPYVQRWMFdbWIJZqVrQ
- W/ZdG149X2FggWGhYsBj3mT7ZhhnM2hOaWhqf2uWbK1twm7Xb+tw/XIPcx90L3U+dkt3
- WHhkeW56eHuAfIh9j36Uf5mAnIGegqCDoYShhaCGnoebiJiJlIqPi4mMg418jnOPa5Bi
- kViSTpNDlDiVLJYglxSYB5j5meqa3JvNnL6drZ6dn4ugeqFnolWjQqQupRqmBqbxp9uo
- xamvqpirgKxorVCuN68dsAOw6LHNsrKzlrR5tVy2P7chuAK45LnEuqS7hLxjvUG+H779
- v9nAtsGRwmvDRcQfxPfFz8amx3zIUskmyfrKzcuezG7NPs4MztrPptBx0TvSBNLN05PU
- WNUd1eDWotdi2CLY4dme2lrbFtvQ3IndQd353q/fZOAZ4M3hgOIy4uTjleRF5PblpeZU
- 5wTns+hi6RHpwOpw6yDr0OyB7TLt5O6Y70zwAfC38W7yJ/Lh85z0WfUX9db2l/da+B34
- 4vmo+nD7OPwC/Mv9lv5h/y///wAAAVsC8wRbBdgHVgjSCkgLvg00DqsQIRGWExIUhBX7
- F24Y5BpUG8YdOh6sIBwhiiL6JGYl0Cc7KKIqCCttLM8uMi+RMO4yRjOfNPY2STebOOk6
- Njt+PMY+Cj9NQI5BzEMJRENFe0awR+VJGEpJS3hMpk3TTv1QJ1FRUnhTnVTCVedXClgt
- WU9abluOXK1dy17oYAVhIWI7Y1ZkbmWHZp5ntWjLad9q82wHbRluKm87cEpxWHJmc3N0
- f3WKdpR3nHikeat6sXu3fLt9v37Bf8KAw4HDgsODwYS/hb2GuYe0iK+Jqoqli56Ml42Q
- joiPf5B2kWySY5NZlE6VQ5Y4ly2YIpkWmgma/ZvwnOKd1J7Gn7igqqGbooyjfKRtpVym
- TKc7qCqpGqoIqvar5KzSrb+urK+asIaxc7Jfs0u0N7Uitg22+bfjuM65uLqiu4y8db1e
- vke/L8AXwP7B5sLNw7PEmcV+xmPHR8gryQ7J8crTy7TMlc10zlPPMtAQ0OzRyNKj037U
- WNUw1gjW4Ne22IvZX9oz2wbb2Nyp3XneSd8X3+XgsuF+4knjFOPe5KflcOY35v7nxOiI
- 6UzqEOrR65LsUu0R7c7uiu9F7/7wtfFq8h7y0POA9C702vWD9ir2z/dx+BL4r/lK+eT6
- evsQ+6L8NPzD/VH93/5q/vX/ev//AAABAwIsAz8EVQVoBn4HlgipCb0K1gvrDQIOFA8n
- EDwRURJiE3UUhxWZFqsXuhjKGdka5xv2HQIeCh8WIB8hJSIrIy4kMCUxJjEnLigqKSYq
- HSsTLAgs+i3rLtsvxzCyMZwyhTNsNFI1NjYXNvg32Di4OZU6cjtOPCo9BT3ePrg/kUBp
- QUJCGkLyQ8pEokV6RlJHKkgCSNpJsUqKS2NMO00UTe1Oxk+gUHlRU1ItUwZT4FS5VZRW
- bldIWCJY/FnWWrBbilxlXT1eF17xX8pgo2F8YlZjLmQHZN9lt2aOZ2ZoPWkUaetqwmuY
- bG5tRG4Zbu5vxHCYcW1yQHMUc+h0u3WNdmB3MngEeNZ5qHp5e0p8G3zsfbx+jX9dgC6A
- /oHPgp+DcIRBhRKF44a0h4eIWIkqif2K0YukjHiNTI4hjvaPzJCikXmSUJMolACU2ZWy
- loyXZphBmRyZ+JrVm7Gcj51tnkufKqAKoOqhzKKto4+kcqVWpjqnH6gFqOup06q7q6Ss
- jq15rmWvUrBAsS+yH7MRtAS0+LXutuW33bjXudO60LvQvNK91r7cv+XA8cH/wxDEJcU9
- xlnHeMicycTK88wlzV7OnM/g0SvSfdPV1TjWoNgR2YvbDdyX3izfyeFv4x/k1+aa6GTq
- N+wR7fPv3fHN88X1w/e9+cD7yv3c//8AAG5kaW4AAAAAAAAGNgAAlxAAAFckAABTogAA
- h5oAAChVAAAWqAAAUA0AAFQ5AAJZmQACXrgAAWZmAAMBAAACAAAAAgAFAAsAEgAbACYA
- MgBAAE8AXwBxAIQAmQCvAMYA3gD4ARMBLwFNAWsBiwGsAc4B8gIXAj0CZAKMArYC4AMM
- AzkDaAOXA8gD+gQtBGIEmATPBQcFQQV8BbgF9gY1BnUGtwb6Bz8HhQfNCBYIYQitCPsJ
- SgmbCe4KQgqYCvALSQukDAEMYAzADSINhg3sDlMOvQ8oD5UQBBB0EOcRWxHREkoSxBM/
- E70UPRS+FUEVxxZOFtcXYhfuGH0ZDhmgGjUayxtkG/4cmx05HdkefB8gH8YgbyEaIcYi
- dSMmI9kkjiVGJf8muyd5KDko/CnBKogrUiweLO0tvi6RL2cwPzEaMfgy2DO6NJ81hzZx
- N144TTk/OjM7KjwjPR8+Hj8eQCJBKEIwQztESEVYRmpHfkiVSa9Ky0vpTQpOLk9UUH1R
- qFLWVAZVOVZvV6dY4logW2Bco13pXzJgfWHLYxxkcGXHZyBofGncaz5so24Lb3Zw43JU
- c8h1P3a5eDd5t3s7fMJ+TX/cgW6DBISehjyH3omEiy+M346TkE2SC5PPlZiXZ5k8mxac
- 957eoMyiwKS7pryoxarUrOuvCLEts1i1irfDugO8Sb6UwOXDPMWXx/XKWMy8zyPRitPy
- 1lrYwNsk3Ybf5uJC5Jvm8elD65Lt3/Ap8nD0tvb5+T/7g/3F//8AAAACAAUACwATABwA
- JwAzAEEAUABhAHMAhwCcALIAygDjAP0BGQE1AVMBcwGTAbUB2AH8AiICSQJxApoCxALw
- Ax0DSwN7A6sD3QQRBEUEewSyBOsFJQVgBZ0F2wYaBlsGnQbhBycHbge2CAAITAiZCOgJ
- OQmLCeAKNQqNCucLQgufC/4MXwzBDSYNjA31Dl8Oyw85D6kQGxCPEQQRfBH2EnES7hNt
- E+8UchT2FX0WBhaQFxwXqxg7GM0ZYRn3Go4bKBvDHGEdAB2iHkUe6x+SIDsg5yGVIkQi
- 9iOqJGAlGCXTJpAnTygQKNMpmSphKywr+SzILZoubi9EMB0w+THXMrczmjR/NWc2UTc9
- OCw5HjoSOwg8ADz7Pfk++D/6QP5CBUMORBlFJkY2R0hIXElySopLpUzCTeFPA1AnUU1S
- dVOfVMxV+1ctWGBZllrOXAldRV6EX8ZhCWJPY5dk4mYuZ31ozmoia3dsz24qb4Zw5XJG
- c6p1EHZ4d+N5UHrAfDN9qH8fgJmCF4OWhRmGn4goibSLQ4zVjmuQBJGhk0GU5ZaNmDmZ
- 6ZucnVSfEKDQopWkXqYrp/2p1KuvrY+vc7Fds0u1Prc1uTK7M706v0bBV8NuxYvHr8nZ
- zArOQ9CE0s7VJNeE2fDcat7z4Y3kOOb26crss++z8sn19/ky/IL//wAAAAMACQATACAA
- MABDAFgAcACLAKgAxwDpAQ0BNAFdAYgBtQHlAhcCSwKCAroC9QMzA3IDtAP4BD4EhwTT
- BSAFcAXDBhgGcAbLBygHiAfrCFEIuQklCZQKBgp8CvQLcAvwDHMM+Q2DDhAOoQ82D84Q
- aREIEasSURL6E6YUVhUJFb8WeBc0F/IYtBl4Gj8bCBvUHKMddB5HHx0f9SDQIawijCNt
- JFElOCYhJwwn+SjqKdwq0SvJLMMtvy6/L8AwxTHMMtYz4jTxNgM3GDgwOUo6ZzuHPKo9
- zz74QCNBUkKDQ7dE7kYpR2ZIpknqSzBMek3GTxVQZ1G9UxRUb1XNVy1Yj1n0W1xcxV4x
- X59hD2KAY/RlaWbfaFhp0WtMbMluR2/GcUZyx3RKdc53U3jZemB76H1xfvuAh4ITg6CF
- L4a+iE6J3otwjQKOlZAokbyTUZTmlnuYEJmmmzyc0Z5nn/2hkqMnpLymUKfkqXarCKyZ
- rimvuLFGstK0XLXkt2u477pxu/G9br7owF/B08NExLHGG8eByOLKQMuazO/OQc+O0NbS
- G9Nb1JjVztcC2DHZXdqD26fcx93j3vzgEeEi4jHjPORF5UvmTedO6EvpR+pA6zjsLe0g
- 7hLvAe/x8N3xyfKz8530hPVr9lD3Nfgd+QT56PrM+6/8kP1v/k7/Jv//AABkZXNjAAAA
- AAAAAApDb2xvciBMQ0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAA
- AAAPAAAADG5iTk8AAAASAAAAxHN2U0UAAAAQAAAA1mZpRkkAAAAQAAAA5mRhREsAAAAc
- AAAA9npoQ04AAAAMAAABEmZyRlIAAAAWAAABHmphSlAAAAAOAAABNGVuVVMAAAASAAAB
- QnB0QlIAAAAYAAABVGVzRVMAAAASAAABbHpoVFcAAAAOAAABfmtvS1IAAAAMAAABjGRl
- REUAAAAQAAABmG5sTkwAAAAWAAABqGl0SVQAAAAUAAABvgBGAGEAcgBnAGUALQBMAEMA
- RABGAOQAcgBnAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBl
- AHMAawDmAHIAbV9pgnIAIABMAEMARABMAEMARAAgAGMAbwB1AGwAZQB1AHIwqzDpMPwA
- IABMAEMARABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAGMAbwBsAG8AcgBpAGQAbwBM
- AEMARAAgAGMAbwBsAG8Acl9pgnJtsmZ2mG95OlZozuy37AAgAEwAQwBEAEYAYQByAGIA
- LQBMAEMARABLAGwAZQB1AHIAZQBuAC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAaQAA
- bW1vZAAAAAAAAAYQAACcXgAAAADAJqAAAAAAAAAAAAAAAAAAAAAAAHRleHQAAAAAQ29w
- eXJpZ2h0IEFwcGxlLCBJbmMuLCAyMDA5AA==
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- FitInWindow
-
- Frame
- {{66, 0}, {716, 778}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 138
- VisibleRegion
- {{-102.812, 1.09403}, {783.325, 731.906}}
- Zoom
- 0.91405183076858521
- ZoomValues
-
-
- Canvas 1
- 0.0
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/docs/storage.png b/docs/storage.png
index 64bf13035..f02d2852a 100644
Binary files a/docs/storage.png and b/docs/storage.png differ
diff --git a/docs/style.css b/docs/style.css
index 62ef864b5..4f6b1c066 100644
--- a/docs/style.css
+++ b/docs/style.css
@@ -39,6 +39,9 @@ li { margin-left: 2.8em; font-size: 92%; }
p, ul, ol, img {margin-bottom: 1em;}
+.align-right {
+ float: right;
+}
.document {
margin-left: 10px;
diff --git a/docs/todo.html b/docs/todo.html
index b648528e4..bc87f2dbe 100644
--- a/docs/todo.html
+++ b/docs/todo.html
@@ -21,11 +21,11 @@
relevance 4 | ../src/session_impl.cpp:480 | in order to support SSL over uTP, the utp_socket manager either needs to be able to receive packets on multiple ports, or we need to peek into the first few bytes the payload stream of a socket to determine whether or not it's an SSL connection. (The former is simpler but won't do as well with NATs) |
in order to support SSL over uTP, the utp_socket manager either
needs to be able to receive packets on multiple ports, or we need to
peek into the first few bytes the payload stream of a socket to determine
@@ -81,7 +81,58 @@ do as well with NATs)../src/session_impl.cpp:480relevance 4 | ../src/kademlia/refresh.cpp:93 | when bootstrapping against our own IP completes, continue to issue another bootstrap against the deepest, non-full bucket. when it completes, issue a bootstrap against one bucket above it, and so on until the bootstrap lookup against the top level bucket (bucket 0) completes. That's when the bootstrap is done |
|
when bootstrapping against our own IP completes,
+ | ||
relevance 4 | ../src/torrent.cpp:9550 | this logic doesn't work for seeding torrents that are not ticked |
this logic doesn't work for seeding torrents that are not ticked../src/torrent.cpp:9550 {
+ i = m_connections.begin() + idx;
+ --idx;
+ }
+ }
+ if (m_ses.alerts().should_post<stats_alert>())
+ m_ses.alerts().post_alert(stats_alert(get_handle(), tick_interval_ms, m_stat));
+
+ m_total_uploaded += m_stat.last_payload_uploaded();
+ m_total_downloaded += m_stat.last_payload_downloaded();
+ m_stat.second_tick(tick_interval_ms);
+
+ // these counters are saved in the resume data, since they updated
+ // we need to save the resume data too
+ m_need_save_resume_data = true;
+
+ // if the rate is 0, there's no update because of network transfers
+ if (m_stat.low_pass_upload_rate() > 0 || m_stat.low_pass_download_rate() > 0)
+ state_updated();
+
+
+ // this section determines whether the torrent is active or not. When it
+ // changes state, it may also trigger the auto-manage logic to reconsider
+ // which torrents should be queued and started. There is a low pass
+ // filter in order to avoid flapping (auto_manage_startup).
+ bool is_inactive = false;
+ if (is_finished())
+ is_inactive = m_stat.upload_payload_rate() < m_ses.settings().get_int(settings_pack::inactive_up_rate);
+ else
+ is_inactive = m_stat.download_payload_rate() < m_ses.settings().get_int(settings_pack::inactive_down_rate);
+
+ if (is_inactive)
+ {
+ if (m_inactive_counter < 0) m_inactive_counter = 0;
+ if (m_inactive_counter < INT16_MAX)
+ {
+ ++m_inactive_counter;
+
+ // if this torrent was just considered inactive, we may want
+ // to dequeue some other torrent
+ if (m_inactive == false
+ && m_inactive_counter >= m_ses.settings().get_int(settings_pack::auto_manage_startup))
+ {
+ m_inactive = true;
+ if (m_ses.settings().get_bool(settings_pack::dont_count_slow_torrents))
+ m_ses.trigger_auto_manage();
+ }
+ }
+ }
+ else
+ {
+ | ||
relevance 4 | ../src/kademlia/refresh.cpp:93 | when bootstrapping against our own IP completes, continue to issue another bootstrap against the deepest, non-full bucket. when it completes, issue a bootstrap against one bucket above it, and so on until the bootstrap lookup against the top level bucket (bucket 0) completes. That's when the bootstrap is done |
when bootstrapping against our own IP completes,
continue to issue another bootstrap against the deepest,
non-full bucket. when it completes, issue a bootstrap against
one bucket above it, and so on until the bootstrap lookup
@@ -124,7 +175,7 @@ void bootstrap::done()
} } // namespace libtorrent::dht
- | ||
relevance 3 | ../src/disk_io_thread.cpp:242 | it would be nice to have the number of threads be set dynamically |
it would be nice to have the number of threads be set dynamically../src/disk_io_thread.cpp:242 std::pair<block_cache::iterator, block_cache::iterator> pieces
+ | ||
relevance 3 | ../src/disk_io_thread.cpp:242 | it would be nice to have the number of threads be set dynamically |
it would be nice to have the number of threads be set dynamically../src/disk_io_thread.cpp:242 std::pair<block_cache::iterator, block_cache::iterator> pieces
= m_disk_cache.all_pieces();
TORRENT_ASSERT(pieces.first == pieces.second);
#endif
@@ -175,8 +226,8 @@ void bootstrap::done()
m_threads.resize(m_num_threads);
}
}
- | ||
relevance 3 | ../src/peer_connection.cpp:1719 | we should probably use ses.m_allowed_upload_slots here instead to work with auto-unchoke logic |
we should probably use ses.m_allowed_upload_slots here instead
-to work with auto-unchoke logic../src/peer_connection.cpp:1719
+ | ||
relevance 3 | ../src/peer_connection.cpp:1729 | we should probably use ses.m_allowed_upload_slots here instead to work with auto-unchoke logic |
we should probably use ses.m_allowed_upload_slots here instead
+to work with auto-unchoke logic../src/peer_connection.cpp:1729
if (t->graceful_pause())
{
#if defined TORRENT_VERBOSE_LOGGING
@@ -227,11 +278,11 @@ to work with auto-unchoke logic../src/peer_connection.cpp:1719 | ||
relevance 3 | ../src/peer_connection.cpp:3049 | since we throw away the queue entry once we issue the disk job, this may happen. Instead, we should keep the queue entry around, mark it as having been requested from disk and once the disk job comes back, discard it if it has been cancelled. Maybe even be able to cancel disk jobs? |
since we throw away the queue entry once we issue
+ | ||
relevance 3 | ../src/peer_connection.cpp:3059 | since we throw away the queue entry once we issue the disk job, this may happen. Instead, we should keep the queue entry around, mark it as having been requested from disk and once the disk job comes back, discard it if it has been cancelled. Maybe even be able to cancel disk jobs? |
since we throw away the queue entry once we issue
the disk job, this may happen. Instead, we should keep the
queue entry around, mark it as having been requested from
disk and once the disk job comes back, discard it if it has
-been cancelled. Maybe even be able to cancel disk jobs?../src/peer_connection.cpp:3049
+been cancelled. Maybe even be able to cancel disk jobs?../src/peer_connection.cpp:3059
std::vector<peer_request>::iterator i
= std::find(m_requests.begin(), m_requests.end(), r);
@@ -282,9 +333,9 @@ been cancelled. Maybe even be able to cancel disk jobs?../src/peer_conn
{
INVARIANT_CHECK;
- | ||
relevance 3 | ../src/peer_connection.cpp:4746 | instead of using settings_pack::request_timeout, use m_rtt.mean() + m_rtt.avg_deviation() * 2 or something like that. the configuration option could hopefully be removed |
instead of using settings_pack::request_timeout, use
+ | ||
relevance 3 | ../src/peer_connection.cpp:4756 | instead of using settings_pack::request_timeout, use m_rtt.mean() + m_rtt.avg_deviation() * 2 or something like that. the configuration option could hopefully be removed |
instead of using settings_pack::request_timeout, use
m_rtt.mean() + m_rtt.avg_deviation() * 2 or something like that.
-the configuration option could hopefully be removed../src/peer_connection.cpp:4746 // don't bother disconnect peers we haven't been interested
+the configuration option could hopefully be removed../src/peer_connection.cpp:4756 // don't bother disconnect peers we haven't been interested
// in (and that hasn't been interested in us) for a while
// unless we have used up all our connection slots
if (may_timeout
@@ -335,7 +386,7 @@ the configuration option could hopefully be removed../src/peer_connecti
#endif
}
if (is_disconnecting()) return;
- | ||
relevance 3 | ../src/piece_picker.cpp:3166 | it would be nice if this could be folded into lock_piece() the main distinction is that this also maintains the m_num_passed counter and the passed_hash_check member |
it would be nice if this could be folded into lock_piece()
+ | ||
relevance 3 | ../src/piece_picker.cpp:3166 | it would be nice if this could be folded into lock_piece() the main distinction is that this also maintains the m_num_passed counter and the passed_hash_check member |
it would be nice if this could be folded into lock_piece()
the main distinction is that this also maintains the m_num_passed
counter and the passed_hash_check member../src/piece_picker.cpp:3166 int state = m_piece_map[piece].state;
if (state == piece_pos::piece_open) return;
@@ -388,7 +439,7 @@ counter and the passed_hash_check member../src/piece_picker.cpp:3166 | ||
relevance 3 | ../src/resolver.cpp:39 | the first places to use this resolver is the http_connection/http_tracker_connection and udp_tracker_connection. make sure to prefer cache on shutdown |
the first places to use this resolver is the
+ | ||
relevance 3 | ../src/resolver.cpp:39 | the first places to use this resolver is the http_connection/http_tracker_connection and udp_tracker_connection. make sure to prefer cache on shutdown |
the first places to use this resolver is the
http_connection/http_tracker_connection and udp_tracker_connection.
make sure to prefer cache on shutdown../src/resolver.cpp:39THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -441,7 +492,7 @@ namespace libtorrent
}
h(ec, ce.addresses);
- | ||
relevance 3 | ../src/session_impl.cpp:5697 | it would be really nice to update these counters as they are incremented. This depends on the session being ticked, which has a fairly coarse grained resolution |
it would be really nice to update these counters
+ | ||
relevance 3 | ../src/session_impl.cpp:5697 | it would be really nice to update these counters as they are incremented. This depends on the session being ticked, which has a fairly coarse grained resolution |
it would be really nice to update these counters
as they are incremented. This depends on the session
being ticked, which has a fairly coarse grained resolution../src/session_impl.cpp:5697 t->status(&alert->status.back(), ~torrent_handle::query_accurate_download_counters);
t->clear_in_state_update();
@@ -494,7 +545,7 @@ being ticked, which has a fairly coarse grained resolution../src/sessio
for (int i = 0; i < counters::num_counters; ++i)
values[i] = m_stats_counters[i];
- | ||
relevance 3 | ../src/session_impl.cpp:7156 | If socket jobs could be higher level, to include RC4 encryption and decryption, we would offload the main thread even more |
If socket jobs could be higher level, to include RC4 encryption and decryption,
+ | ||
relevance 3 | ../src/session_impl.cpp:7156 | If socket jobs could be higher level, to include RC4 encryption and decryption, we would offload the main thread even more |
If socket jobs could be higher level, to include RC4 encryption and decryption,
we would offload the main thread even more../src/session_impl.cpp:7156 {
int num_threads = m_settings.get_int(settings_pack::network_threads);
int num_pools = num_threads > 0 ? num_threads : 1;
@@ -546,7 +597,7 @@ we would offload the main thread even more../src/session_impl.cpp:7156<
, end(m_connections.end()); i != end; ++i)
{
int type = (*i)->type();
- | ||
relevance 3 | ../src/torrent.cpp:1081 | if any other peer has a busy request to this block, we need to cancel it too |
if any other peer has a busy request to this block, we need to cancel it too../src/torrent.cpp:1081#endif
+ | ||
relevance 3 | ../src/torrent.cpp:1083 | if any other peer has a busy request to this block, we need to cancel it too |
if any other peer has a busy request to this block, we need to cancel it too../src/torrent.cpp:1083#endif
TORRENT_ASSERT(j->piece >= 0);
@@ -597,7 +648,7 @@ we would offload the main thread even more../src/session_impl.cpp:7156<
alerts().post_alert(file_error_alert(j->error.ec
, resolve_filename(j->error.file), j->error.operation_str(), get_handle()));
if (c) c->disconnect(errors::no_memory, peer_connection_interface::op_file);
- | ||
relevance 3 | ../src/torrent.cpp:7600 | if peer is a really good peer, maybe we shouldn't disconnect it |
if peer is a really good peer, maybe we shouldn't disconnect it../src/torrent.cpp:7600#if defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
+ | ||
relevance 3 | ../src/torrent.cpp:7594 | if peer is a really good peer, maybe we shouldn't disconnect it |
if peer is a really good peer, maybe we shouldn't disconnect it../src/torrent.cpp:7594#if defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
debug_log("incoming peer (%d)", int(m_connections.size()));
#endif
@@ -648,7 +699,7 @@ we would offload the main thread even more../src/session_impl.cpp:7156<
if (m_abort) return false;
if (!m_connections.empty()) return true;
- | ||
relevance 3 | ../src/web_peer_connection.cpp:586 | just make this peer not have the pieces associated with the file we just requested. Only when it doesn't have any of the file do the following |
just make this peer not have the pieces
+ | ||
relevance 3 | ../src/web_peer_connection.cpp:586 | just make this peer not have the pieces associated with the file we just requested. Only when it doesn't have any of the file do the following |
just make this peer not have the pieces
associated with the file we just requested. Only
when it doesn't have any of the file do the following../src/web_peer_connection.cpp:586 {
++m_num_responses;
@@ -701,7 +752,7 @@ when it doesn't have any of the file do the following../src/web_peer_co
{
// we should not try this server again.
t->remove_web_seed(this, errors::missing_location, op_bittorrent, 2);
- | ||
relevance 3 | ../include/libtorrent/block_cache.hpp:212 | could this be a scoped_array instead? does cached_piece_entry really need to be copyable? cached_piece_entry does need to be copyable since it's part of a container, but it's possible it could be a raw pointer or boost::unique_ptr perhaps |
could this be a scoped_array instead? does cached_piece_entry really need to be copyable?
+ | ||
relevance 3 | ../include/libtorrent/block_cache.hpp:212 | could this be a scoped_array instead? does cached_piece_entry really need to be copyable? cached_piece_entry does need to be copyable since it's part of a container, but it's possible it could be a raw pointer or boost::unique_ptr perhaps |
could this be a scoped_array instead? does cached_piece_entry really need to be copyable?
cached_piece_entry does need to be copyable since it's part of a container, but it's possible
it could be a raw pointer or boost::unique_ptr perhaps../include/libtorrent/block_cache.hpp:212 // on this piece to complete. These are executed at that point.
tailqueue read_jobs;
@@ -728,7 +779,7 @@ it could be a raw pointer or boost::unique_ptr perhaps../include/libtor
// the last time a block was written to this piece
// plus the minimum amount of time the block is guaranteed
// to stay in the cache
- | ||
relevance 3 | ../include/libtorrent/disk_io_thread.hpp:537 | turn these counters and gauges into session_stats counters (which also would need to be thread safe) |
turn these counters and gauges into session_stats
+ | ||
relevance 3 | ../include/libtorrent/disk_io_thread.hpp:537 | turn these counters and gauges into session_stats counters (which also would need to be thread safe) |
turn these counters and gauges into session_stats
counters (which also would need to be thread safe)../include/libtorrent/disk_io_thread.hpp:537 void* m_userdata;
// the last time we expired write blocks from the cache
@@ -780,7 +831,7 @@ counters (which also would need to be thread safe)../include/libtorrent
// when it's OK to exit the main loop of the disk thread
boost::atomic<int> m_num_blocked_jobs;
- | ||
relevance 3 | ../include/libtorrent/policy.hpp:104 | this class should be renamed peer_list |
this class should be renamed peer_list../include/libtorrent/policy.hpp:104 int min_reconnect_time;
+ | ||
relevance 3 | ../include/libtorrent/policy.hpp:104 | this class should be renamed peer_list |
this class should be renamed peer_list../include/libtorrent/policy.hpp:104 int min_reconnect_time;
// the number of iterations over the peer list for this operation
int loop_counter;
@@ -831,7 +882,7 @@ counters (which also would need to be thread safe)../include/libtorrent
// called when an incoming connection is accepted
// false means the connection was refused or failed
- | ||
relevance 3 | ../include/libtorrent/session.hpp:210 | could the fingerprint be a setting as well? And should the settings_pack be optional? |
could the fingerprint be a setting as well? And should the
+ | ||
relevance 3 | ../include/libtorrent/session.hpp:210 | could the fingerprint be a setting as well? And should the settings_pack be optional? |
could the fingerprint be a setting as well? And should the
settings_pack be optional?../include/libtorrent/session.hpp:210 //
// see apply_settings().
class TORRENT_EXPORT session: public boost::noncopyable
@@ -883,7 +934,7 @@ settings_pack be optional?../include/libtorrent/session.hpp:210 | ||
relevance 2 | ../src/disk_io_thread.cpp:844 | should this be allocated on the stack? |
should this be allocated on the stack?../src/disk_io_thread.cpp:844 // if we're also flushing the read cache, this piece
+ | ||
relevance 2 | ../src/disk_io_thread.cpp:844 | should this be allocated on the stack? |
should this be allocated on the stack?../src/disk_io_thread.cpp:844 // if we're also flushing the read cache, this piece
// should be removed as soon as all write jobs finishes
// otherwise it will turn into a read piece
}
@@ -934,7 +985,7 @@ settings_pack be optional?../include/libtorrent/session.hpp:210 | ||
relevance 2 | ../src/disk_io_thread.cpp:885 | we're not flushing the read cache at all? |
we're not flushing the read cache at all?../src/disk_io_thread.cpp:885 // from disk_io_thread::do_delete, which is a fence job and should
+ | ||
relevance 2 | ../src/disk_io_thread.cpp:885 | we're not flushing the read cache at all? |
we're not flushing the read cache at all?../src/disk_io_thread.cpp:885 // from disk_io_thread::do_delete, which is a fence job and should
// have any other jobs active, i.e. there should not be any references
// keeping pieces or blocks alive
if ((flags & flush_delete_cache) && (flags & flush_expect_clear))
@@ -985,7 +1036,7 @@ settings_pack be optional?../include/libtorrent/session.hpp:210 | ||
relevance 2 | ../src/file.cpp:1491 | use vm_copy here, if available, and if buffers are aligned |
use vm_copy here, if available, and if buffers are aligned../src/file.cpp:1491 CloseHandle(native_handle());
+ | ||
relevance 2 | ../src/file.cpp:1491 | use vm_copy here, if available, and if buffers are aligned |
use vm_copy here, if available, and if buffers are aligned../src/file.cpp:1491 CloseHandle(native_handle());
m_path.clear();
#else
if (m_file_handle != INVALID_HANDLE_VALUE)
@@ -1015,7 +1066,7 @@ settings_pack be optional?../include/libtorrent/session.hpp:210 | ||
relevance 2 | ../src/file.cpp:1502 | use vm_copy here, if available, and if buffers are aligned |
use vm_copy here, if available, and if buffers are aligned../src/file.cpp:1502 }
+ | ||
relevance 2 | ../src/file.cpp:1502 | use vm_copy here, if available, and if buffers are aligned |
use vm_copy here, if available, and if buffers are aligned../src/file.cpp:1502 }
// defined in storage.cpp
int bufs_size(file::iovec_t const* bufs, int num_bufs);
@@ -1066,7 +1117,7 @@ settings_pack be optional?../include/libtorrent/session.hpp:210 | ||
relevance 2 | ../src/session_impl.cpp:2568 | use bind_to_device in udp_socket |
use bind_to_device in udp_socket../src/session_impl.cpp:2568 if (m_listen_sockets.empty() && ec)
+ | ||
relevance 2 | ../src/session_impl.cpp:2568 | use bind_to_device in udp_socket |
use bind_to_device in udp_socket../src/session_impl.cpp:2568 if (m_listen_sockets.empty() && ec)
{
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
char msg[200];
@@ -1117,7 +1168,7 @@ settings_pack be optional?../include/libtorrent/session.hpp:210 | ||
relevance 2 | ../src/session_impl.cpp:4596 | make a list for torrents that want to be announced on the DHT so we don't have to loop over all torrents, just to find the ones that want to announce |
make a list for torrents that want to be announced on the DHT so we
+ | ||
relevance 2 | ../src/session_impl.cpp:4596 | make a list for torrents that want to be announced on the DHT so we don't have to loop over all torrents, just to find the ones that want to announce |
make a list for torrents that want to be announced on the DHT so we
don't have to loop over all torrents, just to find the ones that want to announce../src/session_impl.cpp:4596 if (!m_dht_torrents.empty())
{
boost::shared_ptr<torrent> t;
@@ -1169,7 +1220,7 @@ don't have to loop over all torrents, just to find the ones that want to announc
if (m_torrents.empty()) return;
if (m_next_lsd_torrent == m_torrents.end())
- | ||
relevance 2 | ../src/torrent.cpp:699 | post alert |
post alert../src/torrent.cpp:699 state_updated();
+ | ||
relevance 2 | ../src/torrent.cpp:701 | post alert |
post alert../src/torrent.cpp:701 state_updated();
set_state(torrent_status::downloading);
@@ -1220,8 +1271,8 @@ don't have to loop over all torrents, just to find the ones that want to announc
TORRENT_ASSERT(piece >= 0);
TORRENT_ASSERT(m_verified.get_bit(piece) == false);
++m_num_verified;
- | ||
relevance 2 | ../src/torrent.cpp:4646 | abort lookups this torrent has made via the session host resolver interface |
abort lookups this torrent has made via the
-session host resolver interface../src/torrent.cpp:4646 // files belonging to the torrents
+ | ||
relevance 2 | ../src/torrent.cpp:4648 | abort lookups this torrent has made via the session host resolver interface |
abort lookups this torrent has made via the
+session host resolver interface../src/torrent.cpp:4648 // files belonging to the torrents
disconnect_all(errors::torrent_aborted, peer_connection_interface::op_bittorrent);
// post a message to the main thread to destruct
@@ -1272,7 +1323,7 @@ session host resolver interface../src/torrent.cpp:4646relevance 2 | ../src/udp_tracker_connection.cpp:64 | it would be nice to not have a dependency on session_impl here |
|
it would be nice to not have a dependency on session_impl here../src/udp_tracker_connection.cpp:64#pragma warning(pop)
+ | ||
relevance 2 | ../src/udp_tracker_connection.cpp:64 | it would be nice to not have a dependency on session_impl here |
it would be nice to not have a dependency on session_impl here../src/udp_tracker_connection.cpp:64#pragma warning(pop)
#endif
#include "libtorrent/tracker_manager.hpp"
@@ -1323,7 +1374,7 @@ namespace libtorrent
if (port == -1) port = protocol == "http" ? 80 : 443;
if (ec)
- | ||
relevance 2 | ../src/web_peer_connection.cpp:645 | create a mapping of file-index to redirection URLs. Use that to form URLs instead. Support to reconnect to a new server without destructing this peer_connection |
create a mapping of file-index to redirection URLs. Use that to form
+ | ||
relevance 2 | ../src/web_peer_connection.cpp:645 | create a mapping of file-index to redirection URLs. Use that to form URLs instead. Support to reconnect to a new server without destructing this peer_connection |
create a mapping of file-index to redirection URLs. Use that to form
URLs instead. Support to reconnect to a new server without destructing this
peer_connection../src/web_peer_connection.cpp:645 == dl_target);
#endif
@@ -1376,7 +1427,58 @@ peer_connection../src/web_peer_connection.cpp:645relevance 2 | ../src/kademlia/node.cpp:67 | make this configurable in dht_settings |
|
make this configurable in dht_settings../src/kademlia/node.cpp:67#include "libtorrent/kademlia/routing_table.hpp"
+ | ||
relevance 2 | ../src/kademlia/dos_blocker.cpp:68 | make these limits configurable |
make these limits configurable../src/kademlia/dos_blocker.cpp:68 bool dos_blocker::incoming(address addr, ptime now)
+ {
+ node_ban_entry* match = 0;
+ node_ban_entry* min = m_ban_nodes;
+ for (node_ban_entry* i = m_ban_nodes; i < m_ban_nodes + num_ban_nodes; ++i)
+ {
+ if (i->src == addr)
+ {
+ match = i;
+ break;
+ }
+ if (i->count < min->count) min = i;
+ else if (i->count == min->count
+ && i->limit < min->limit) min = i;
+ }
+
+ if (match)
+ {
+ ++match->count;
+
+ if (match->count >= 50)
+ {
+ if (now < match->limit)
+ {
+ if (match->count == 50)
+ {
+#ifdef TORRENT_DHT_VERBOSE_LOGGING
+ TORRENT_LOG(dht_tracker) << " BANNING PEER [ ip: "
+ << addr << " time: " << total_milliseconds((now - match->limit) + seconds(10)) / 1000.f
+ << " count: " << match->count << " ]";
+#endif
+ // we've received 50 messages in less than 10 seconds from
+ // this node. Ignore it until it's silent for 5 minutes
+ match->limit = now + minutes(5);
+ }
+
+ return false;
+ }
+
+ // we got 50 messages from this peer, but it was in
+ // more than 10 seconds. Reset the counter and the timer
+ match->count = 0;
+ match->limit = now + seconds(10);
+ }
+ }
+ else
+ {
+ min->count = 1;
+ min->limit = now + seconds(10);
+ min->src = addr;
+ }
+ | ||
relevance 2 | ../src/kademlia/node.cpp:67 | make this configurable in dht_settings |
make this configurable in dht_settings../src/kademlia/node.cpp:67#include "libtorrent/kademlia/routing_table.hpp"
#include "libtorrent/kademlia/node.hpp"
#include "libtorrent/kademlia/dht_observer.hpp"
@@ -1427,7 +1529,7 @@ void purge_peers(std::set<peer_entry>& peers)
void nop() {}
- | ||
relevance 2 | ../src/kademlia/node_id.cpp:133 | this could be optimized if SSE 4.2 is available. It could also be optimized given that we have a fixed length |
this could be optimized if SSE 4.2 is
+ | ||
relevance 2 | ../src/kademlia/node_id.cpp:133 | this could be optimized if SSE 4.2 is available. It could also be optimized given that we have a fixed length |
this could be optimized if SSE 4.2 is
available. It could also be optimized given
that we have a fixed length../src/kademlia/node_id.cpp:133 b6 = ip_.to_v6().to_bytes();
ip = &b6[0];
@@ -1480,7 +1582,7 @@ bool verify_id(node_id const& nid, address const& source_ip)
if (is_local(source_ip)) return true;
node_id h = generate_id_impl(source_ip, nid[19]);
- | ||
relevance 2 | ../include/libtorrent/enum_net.hpp:137 | this could be done more efficiently by just looking up the interface with the given name, maybe even with if_nametoindex() |
this could be done more efficiently by just looking up
+ | ||
relevance 2 | ../include/libtorrent/enum_net.hpp:137 | this could be done more efficiently by just looking up the interface with the given name, maybe even with if_nametoindex() |
this could be done more efficiently by just looking up
the interface with the given name, maybe even with if_nametoindex()../include/libtorrent/enum_net.hpp:137
address ip = address::from_string(device_name, ec);
if (!ec)
@@ -1532,7 +1634,7 @@ the interface with the given name, maybe even with if_nametoindex()../i
// returns true if the given device exists
TORRENT_EXTRA_EXPORT bool has_interface(char const* name, io_service& ios
- | ||
relevance 2 | ../include/libtorrent/intrusive_ptr_base.hpp:44 | remove this class and transition over to using shared_ptr and make_shared instead |
remove this class and transition over to using shared_ptr and
+ | ||
relevance 2 | ../include/libtorrent/intrusive_ptr_base.hpp:44 | remove this class and transition over to using shared_ptr and make_shared instead |
remove this class and transition over to using shared_ptr and
make_shared instead../include/libtorrent/intrusive_ptr_base.hpp:44CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
@@ -1584,7 +1686,7 @@ namespace libtorrent
intrusive_ptr_base(): m_refs(0) {}
- | ||
relevance 2 | ../include/libtorrent/settings_pack.hpp:70 | add an API to query a settings_pack as well |
add an API to query a settings_pack as well../include/libtorrent/settings_pack.hpp:70 | ||
relevance 2 | ../include/libtorrent/settings_pack.hpp:71 | maybe convert all bool types into int-types as well |
maybe convert all bool types into int-types as well../include/libtorrent/settings_pack.hpp:71{
+ | ||
relevance 2 | ../include/libtorrent/settings_pack.hpp:70 | add an API to query a settings_pack as well |
add an API to query a settings_pack as well../include/libtorrent/settings_pack.hpp:70 | ||
relevance 2 | ../include/libtorrent/settings_pack.hpp:71 | maybe convert all bool types into int-types as well |
maybe convert all bool types into int-types as well../include/libtorrent/settings_pack.hpp:71{
namespace aux { struct session_impl; struct session_settings; }
struct settings_pack;
@@ -1635,7 +1737,7 @@ namespace libtorrent
{
string_type_base = 0x0000,
int_type_base = 0x4000,
- | ||
relevance 2 | ../include/libtorrent/torrent.hpp:1184 | replace all usage of this with m_ses.get_resolver() |
replace all usage of this with m_ses.get_resolver()../include/libtorrent/torrent.hpp:1184
+ | ||
relevance 2 | ../include/libtorrent/torrent.hpp:1188 | replace all usage of this with m_ses.get_resolver() |
replace all usage of this with m_ses.get_resolver()../include/libtorrent/torrent.hpp:1188
// The list of web seeds in this torrent. Seeds
// with fatal errors are removed from the set
std::list<web_seed_entry> m_web_seeds;
@@ -1660,7 +1762,7 @@ namespace libtorrent
// this vector is allocated lazily. If no file priorities are
// ever changed, this remains empty. Any unallocated slot
// implicitly means the file has priority 1.
- | ||
relevance 2 | ../include/libtorrent/torrent_info.hpp:303 | there may be some opportunities to optimize the size if torrent_info. specifically to turn some std::string and std::vector into pointers |
there may be some opportunities to optimize the size if torrent_info.
+ | ||
relevance 2 | ../include/libtorrent/torrent_info.hpp:303 | there may be some opportunities to optimize the size if torrent_info. specifically to turn some std::string and std::vector into pointers |
there may be some opportunities to optimize the size if torrent_info.
specifically to turn some std::string and std::vector into pointers../include/libtorrent/torrent_info.hpp:303 bool resolving;
// if the user wanted to remove this while
@@ -1712,7 +1814,7 @@ specifically to turn some std::string and std::vector into pointers../i
#ifndef BOOST_NO_EXCEPTIONS
torrent_info(lazy_entry const& torrent_file, int flags = 0);
torrent_info(char const* buffer, int size, int flags = 0);
- | ||
relevance 2 | ../include/libtorrent/aux_/session_interface.hpp:108 | the IP voting mechanism should be factored out to its own class, not part of the session |
the IP voting mechanism should be factored out
+ | ||
relevance 2 | ../include/libtorrent/aux_/session_interface.hpp:108 | the IP voting mechanism should be factored out to its own class, not part of the session |
the IP voting mechanism should be factored out
to its own class, not part of the session../include/libtorrent/aux_/session_interface.hpp:108 class port_filter;
struct settings_pack;
struct torrent_peer_allocator_interface;
@@ -1764,7 +1866,7 @@ namespace libtorrent { namespace aux
virtual void remove_torrent_impl(boost::shared_ptr<torrent> tptr, int options) = 0;
// ip and port filter
- | ||
relevance 1 | ../src/http_seed_connection.cpp:111 | in chunked encoding mode, this assert won't hold. the chunk headers should be subtracted from the receive_buffer_size |
in chunked encoding mode, this assert won't hold.
+ | ||
relevance 1 | ../src/http_seed_connection.cpp:111 | in chunked encoding mode, this assert won't hold. the chunk headers should be subtracted from the receive_buffer_size |
in chunked encoding mode, this assert won't hold.
the chunk headers should be subtracted from the receive_buffer_size../src/http_seed_connection.cpp:111 boost::optional<piece_block_progress>
http_seed_connection::downloading_piece_progress() const
{
@@ -1816,7 +1918,7 @@ the chunk headers should be subtracted from the receive_buffer_size../s
std::string request;
request.reserve(400);
- | ||
relevance 1 | ../src/session_impl.cpp:6508 | report the proper address of the router as the source IP of this understanding of our external address, instead of the empty address |
report the proper address of the router as the source IP of
+ | ||
relevance 1 | ../src/session_impl.cpp:6508 | report the proper address of the router as the source IP of this understanding of our external address, instead of the empty address |
report the proper address of the router as the source IP of
this understanding of our external address, instead of the empty address../src/session_impl.cpp:6508 void session_impl::on_port_mapping(int mapping, address const& ip, int port
, error_code const& ec, int map_transport)
{
@@ -1868,7 +1970,7 @@ this understanding of our external address, instead of the empty address | ||
relevance 1 | ../src/session_impl.cpp:7668 | we only need to do this if our global IPv4 address has changed since the DHT (currently) only supports IPv4. Since restarting the DHT is kind of expensive, it would be nice to not do it unnecessarily |
we only need to do this if our global IPv4 address has changed
+ | ||
relevance 1 | ../src/session_impl.cpp:7668 | we only need to do this if our global IPv4 address has changed since the DHT (currently) only supports IPv4. Since restarting the DHT is kind of expensive, it would be nice to not do it unnecessarily |
we only need to do this if our global IPv4 address has changed
since the DHT (currently) only supports IPv4. Since restarting the DHT
is kind of expensive, it would be nice to not do it unnecessarily../src/session_impl.cpp:7668#endif
@@ -1921,11 +2023,11 @@ is kind of expensive, it would be nice to not do it unnecessarily../src
, boost::function<void(char*)> const& handler)
{
return m_disk_thread.async_allocate_disk_buffer(category, handler);
- | ||
relevance 1 | ../src/torrent.cpp:1140 | make this depend on the error and on the filesystem the files are being downloaded to. If the error is no_space_left_on_device and the filesystem doesn't support sparse files, only zero the priorities of the pieces that are at the tails of all files, leaving everything up to the highest written piece in each file |
make this depend on the error and on the filesystem the
+ | ||
relevance 1 | ../src/torrent.cpp:1142 | make this depend on the error and on the filesystem the files are being downloaded to. If the error is no_space_left_on_device and the filesystem doesn't support sparse files, only zero the priorities of the pieces that are at the tails of all files, leaving everything up to the highest written piece in each file |
make this depend on the error and on the filesystem the
files are being downloaded to. If the error is no_space_left_on_device
and the filesystem doesn't support sparse files, only zero the priorities
of the pieces that are at the tails of all files, leaving everything
-up to the highest written piece in each file../src/torrent.cpp:1140 alerts().post_alert(file_error_alert(j->error.ec
+up to the highest written piece in each file../src/torrent.cpp:1142 alerts().post_alert(file_error_alert(j->error.ec
, resolve_filename(j->error.file), j->error.operation_str(), get_handle()));
// put the torrent in an error-state
@@ -1976,8 +2078,8 @@ up to the highest written piece in each file../src/torrent.cpp:1140 | ||
relevance 1 | ../src/torrent.cpp:6780 | save the send_stats state instead of throwing them away it may pose an issue when downgrading though |
save the send_stats state instead of throwing them away
-it may pose an issue when downgrading though../src/torrent.cpp:6780 for (int k = 0; k < bits; ++k)
+ | ||
relevance 1 | ../src/torrent.cpp:6774 | save the send_stats state instead of throwing them away it may pose an issue when downgrading though |
save the send_stats state instead of throwing them away
+it may pose an issue when downgrading though../src/torrent.cpp:6774 for (int k = 0; k < bits; ++k)
v |= (i->info[j*8+k].state == piece_picker::block_info::state_finished)
? (1 << k) : 0;
bitmask.append(1, v);
@@ -2028,13 +2130,13 @@ it may pose an issue when downgrading though../src/torrent.cpp:6780 | ||
relevance 1 | ../src/torrent.cpp:7846 | should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though |
should disconnect all peers that have the pieces we have
+ | ||
relevance 1 | ../src/torrent.cpp:7842 | should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though |
should disconnect all peers that have the pieces we have
not just seeds. It would be pretty expensive to check all pieces
-for all peers though../src/torrent.cpp:7846 TORRENT_ASSERT(is_finished());
-
- set_state(torrent_status::finished);
+for all peers though../src/torrent.cpp:7842 set_state(torrent_status::finished);
set_queue_position(-1);
+ m_became_finished = m_ses.session_time();
+
// we have to call completed() before we start
// disconnecting peers, since there's an assert
// to make sure we're cleared the piece picker
@@ -2081,7 +2183,7 @@ for all peers though../src/torrent.cpp:7846relevance 1 | ../src/kademlia/node.cpp:827 | find_node should write directly to the response entry |
|
find_node should write directly to the response entry../src/kademlia/node.cpp:827 TORRENT_LOG(node) << " values: " << reply["values"].list().size();
+ | ||
relevance 1 | ../src/kademlia/node.cpp:827 | find_node should write directly to the response entry |
find_node should write directly to the response entry../src/kademlia/node.cpp:827 TORRENT_LOG(node) << " values: " << reply["values"].list().size();
}
#endif
}
@@ -2132,7 +2234,7 @@ for all peers though../src/torrent.cpp:7846relevance 1 | ../include/libtorrent/ip_voter.hpp:122 | instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc. |
|
instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc.../include/libtorrent/ip_voter.hpp:122 // away all the votes and started from scratch, in case
+ | ||
relevance 1 | ../include/libtorrent/ip_voter.hpp:122 | instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc. |
instead, have one instance per possible subnet, global IPv4, global IPv6, loopback, 192.168.x.x, 10.x.x.x, etc.../include/libtorrent/ip_voter.hpp:122 // away all the votes and started from scratch, in case
// our IP has changed
ptime m_last_rotate;
};
@@ -2159,7 +2261,7 @@ for all peers though../src/torrent.cpp:7846relevance 1 | ../include/libtorrent/web_peer_connection.hpp:121 | if we make this be a disk_buffer_holder instead we would save a copy sometimes use allocate_disk_receive_buffer and release_disk_receive_buffer |
|
if we make this be a disk_buffer_holder instead
+ | ||
relevance 1 | ../include/libtorrent/web_peer_connection.hpp:121 | if we make this be a disk_buffer_holder instead we would save a copy sometimes use allocate_disk_receive_buffer and release_disk_receive_buffer |
if we make this be a disk_buffer_holder instead
we would save a copy sometimes
use allocate_disk_receive_buffer and release_disk_receive_buffer../include/libtorrent/web_peer_connection.hpp:121
// returns the block currently being
@@ -2212,7 +2314,7 @@ use allocate_disk_receive_buffer and release_disk_receive_buffer../incl
};
}
- | ||
relevance 0 | ../src/block_cache.cpp:884 | it's somewhat expensive to iterate over this linked list. Presumably because of the random access of memory. It would be nice if pieces with no evictable blocks weren't in this list |
it's somewhat expensive
+ | ||
relevance 0 | ../src/block_cache.cpp:884 | it's somewhat expensive to iterate over this linked list. Presumably because of the random access of memory. It would be nice if pieces with no evictable blocks weren't in this list |
it's somewhat expensive
to iterate over this linked list. Presumably because of the random
access of memory. It would be nice if pieces with no evictable blocks
weren't in this list../src/block_cache.cpp:884 }
@@ -2266,7 +2368,7 @@ weren't in this list../src/block_cache.cpp:884relevance 0 | ../src/block_cache.cpp:948 | this should probably only be done every n:th time |
|
this should probably only be done every n:th time../src/block_cache.cpp:948 }
+ | ||
relevance 0 | ../src/block_cache.cpp:948 | this should probably only be done every n:th time |
this should probably only be done every n:th time../src/block_cache.cpp:948 }
if (pe->ok_to_evict())
{
@@ -2317,7 +2419,7 @@ weren't in this list../src/block_cache.cpp:884relevance 0 | ../src/block_cache.cpp:1714 | create a holder for refcounts that automatically decrement |
|
create a holder for refcounts that automatically decrement../src/block_cache.cpp:1714
+ | ||
relevance 0 | ../src/block_cache.cpp:1714 | create a holder for refcounts that automatically decrement |
create a holder for refcounts that automatically decrement../src/block_cache.cpp:1714
j->buffer = allocate_buffer("send buffer");
if (j->buffer == 0) return -2;
@@ -2368,7 +2470,7 @@ bool block_cache::maybe_free_piece(cached_piece_entry* pe)
boost::shared_ptr<piece_manager> s = pe->storage;
- | ||
relevance 0 | ../src/bt_peer_connection.cpp:646 | this could be optimized using knuth morris pratt |
this could be optimized using knuth morris pratt../src/bt_peer_connection.cpp:646 {
+ | ||
relevance 0 | ../src/bt_peer_connection.cpp:646 | this could be optimized using knuth morris pratt |
this could be optimized using knuth morris pratt../src/bt_peer_connection.cpp:646 {
disconnect(errors::no_memory, op_encryption);
return;
}
@@ -2419,7 +2521,7 @@ bool block_cache::maybe_free_piece(cached_piece_entry* pe)
// }
// no complete sync
- | ||
relevance 0 | ../src/bt_peer_connection.cpp:2213 | if we're finished, send upload_only message |
if we're finished, send upload_only message../src/bt_peer_connection.cpp:2213 if (msg[5 + k / 8] & (0x80 >> (k % 8))) bitfield_string[k] = '1';
+ | ||
relevance 0 | ../src/bt_peer_connection.cpp:2213 | if we're finished, send upload_only message |
if we're finished, send upload_only message../src/bt_peer_connection.cpp:2213 if (msg[5 + k / 8] & (0x80 >> (k % 8))) bitfield_string[k] = '1';
else bitfield_string[k] = '0';
}
peer_log("==> BITFIELD [ %s ]", bitfield_string.c_str());
@@ -2470,7 +2572,7 @@ bool block_cache::maybe_free_piece(cached_piece_entry* pe)
? m_settings.get_str(settings_pack::user_agent)
: m_settings.get_str(settings_pack::handshake_client_version);
}
- | ||
relevance 0 | ../src/disk_io_thread.cpp:921 | instead of doing a lookup each time through the loop, save cached_piece_entry pointers with piece_refcount incremented to pin them |
instead of doing a lookup each time through the loop, save
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:921 | instead of doing a lookup each time through the loop, save cached_piece_entry pointers with piece_refcount incremented to pin them |
instead of doing a lookup each time through the loop, save
cached_piece_entry pointers with piece_refcount incremented to pin them../src/disk_io_thread.cpp:921 // this is why we pass in 1 as cont_block to the flushing functions
void disk_io_thread::try_flush_write_blocks(int num, tailqueue& completed_jobs
, mutex::scoped_lock& l)
@@ -2522,7 +2624,7 @@ cached_piece_entry pointers with piece_refcount incremented to pin them
cached_piece_entry* pe = m_disk_cache.find_piece(i->first, i->second);
if (pe == NULL) continue;
if (pe->num_dirty == 0) continue;
- | ||
relevance 0 | ../src/disk_io_thread.cpp:1132 | instead of doing this. pass in the settings to each storage_interface call. Each disk thread could hold its most recent understanding of the settings in a shared_ptr, and update it every time it wakes up from a job. That way each access to the settings won't require a mutex to be held. |
instead of doing this. pass in the settings to each storage_interface
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:1132 | instead of doing this. pass in the settings to each storage_interface call. Each disk thread could hold its most recent understanding of the settings in a shared_ptr, and update it every time it wakes up from a job. That way each access to the settings won't require a mutex to be held. |
instead of doing this. pass in the settings to each storage_interface
call. Each disk thread could hold its most recent understanding of the settings
in a shared_ptr, and update it every time it wakes up from a job. That way
each access to the settings won't require a mutex to be held.../src/disk_io_thread.cpp:1132 {
@@ -2566,7 +2668,7 @@ each access to the settings won't require a mutex to be held.../src/dis
// our quanta in case there aren't any other
// jobs to run in between
- | ||
relevance 0 | ../src/disk_io_thread.cpp:1157 | a potentially more efficient solution would be to have a special queue for retry jobs, that's only ever run when a job completes, in any thread. It would only work if m_outstanding_jobs > 0 |
a potentially more efficient solution would be to have a special
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:1157 | a potentially more efficient solution would be to have a special queue for retry jobs, that's only ever run when a job completes, in any thread. It would only work if m_outstanding_jobs > 0 |
a potentially more efficient solution would be to have a special
queue for retry jobs, that's only ever run when a job completes, in
any thread. It would only work if m_outstanding_jobs > 0../src/disk_io_thread.cpp:1157 storage->get_storage_impl()->m_settings = &m_settings;
@@ -2599,7 +2701,7 @@ any thread. It would only work if m_outstanding_jobs > 0../src/disk_io_
}
#if TORRENT_USE_ASSERT
- | ||
relevance 0 | ../src/disk_io_thread.cpp:1171 | it should clear the hash state even when there's an error, right? |
it should clear the hash state even when there's an error, right?../src/disk_io_thread.cpp:1171 --m_outstanding_jobs;
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:1171 | it should clear the hash state even when there's an error, right? |
it should clear the hash state even when there's an error, right?../src/disk_io_thread.cpp:1171 --m_outstanding_jobs;
if (ret == retry_job)
{
@@ -2650,7 +2752,7 @@ any thread. It would only work if m_outstanding_jobs > 0../src/disk_io_
j->error.operation = storage_error::alloc_cache_piece;
return -1;
}
- | ||
relevance 0 | ../src/disk_io_thread.cpp:1866 | maybe the tailqueue_iterator should contain a pointer-pointer instead and have an unlink function |
maybe the tailqueue_iterator should contain a pointer-pointer
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:1866 | maybe the tailqueue_iterator should contain a pointer-pointer instead and have an unlink function |
maybe the tailqueue_iterator should contain a pointer-pointer
instead and have an unlink function../src/disk_io_thread.cpp:1866 j->callback = handler;
add_fence_job(storage, j);
@@ -2702,7 +2804,7 @@ instead and have an unlink function../src/disk_io_thread.cpp:1866<
if (completed_jobs.size())
add_completed_jobs(completed_jobs);
}
- | ||
relevance 0 | ../src/disk_io_thread.cpp:2121 | this is potentially very expensive. One way to solve it would be to have a fence for just this one piece. |
this is potentially very expensive. One way to solve
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:2121 | this is potentially very expensive. One way to solve it would be to have a fence for just this one piece. |
this is potentially very expensive. One way to solve
it would be to have a fence for just this one piece.../src/disk_io_thread.cpp:2121 }
void disk_io_thread::async_clear_piece(piece_manager* storage, int index
@@ -2754,7 +2856,7 @@ it would be to have a fence for just this one piece.../src/disk_io_thre
if (!pe->hash) return;
if (pe->hashing) return;
- | ||
relevance 0 | ../src/disk_io_thread.cpp:2382 | we should probably just hang the job on the piece and make sure the hasher gets kicked |
we should probably just hang the job on the piece and make sure the hasher gets kicked../src/disk_io_thread.cpp:2382 if (pe == NULL)
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:2382 | we should probably just hang the job on the piece and make sure the hasher gets kicked |
we should probably just hang the job on the piece and make sure the hasher gets kicked../src/disk_io_thread.cpp:2382 if (pe == NULL)
{
int cache_state = (j->flags & disk_io_job::volatile_read)
? cached_piece_entry::volatile_read_lru
@@ -2805,7 +2907,7 @@ it would be to have a fence for just this one piece.../src/disk_io_thre
// increment the refcounts of all
// blocks up front, and then hash them without holding the lock
- | ||
relevance 0 | ../src/disk_io_thread.cpp:2452 | introduce a holder class that automatically increments and decrements the piece_refcount |
introduce a holder class that automatically increments
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:2452 | introduce a holder class that automatically increments and decrements the piece_refcount |
introduce a holder class that automatically increments
and decrements the piece_refcount../src/disk_io_thread.cpp:2452 for (int i = ph->offset / block_size; i < blocks_in_piece; ++i)
{
iov.iov_len = (std::min)(block_size, piece_size - ph->offset);
@@ -2857,7 +2959,7 @@ and decrements the piece_refcount../src/disk_io_thread.cpp:2452 | ||
relevance 0 | ../src/disk_io_thread.cpp:2692 | it would be nice to not have to lock the mutex every turn through this loop |
it would be nice to not have to lock the mutex every
+ | ||
relevance 0 | ../src/disk_io_thread.cpp:2692 | it would be nice to not have to lock the mutex every turn through this loop |
it would be nice to not have to lock the mutex every
turn through this loop../src/disk_io_thread.cpp:2692 {
j->error.ec = error::no_memory;
j->error.operation = storage_error::alloc_cache_piece;
@@ -2909,7 +3011,7 @@ turn through this loop../src/disk_io_thread.cpp:2692relevance 0 | ../src/http_tracker_connection.cpp:96 | support authentication (i.e. user name and password) in the URL |
|
support authentication (i.e. user name and password) in the URL../src/http_tracker_connection.cpp:96 , tracker_request const& req
+ | ||
relevance 0 | ../src/http_tracker_connection.cpp:96 | support authentication (i.e. user name and password) in the URL |
support authentication (i.e. user name and password) in the URL../src/http_tracker_connection.cpp:96 , tracker_request const& req
, boost::weak_ptr<request_callback> c
, aux::session_impl& ses
, std::string const& auth
@@ -2960,7 +3062,7 @@ turn through this loop../src/disk_io_thread.cpp:2692 | ||
relevance 0 | ../src/metadata_transfer.cpp:359 | this is not safe. The torrent could be unloaded while we're still sending the metadata |
this is not safe. The torrent could be unloaded while
+ | ||
relevance 0 | ../src/metadata_transfer.cpp:359 | this is not safe. The torrent could be unloaded while we're still sending the metadata |
this is not safe. The torrent could be unloaded while
we're still sending the metadata../src/metadata_transfer.cpp:359 std::pair<int, int> offset
= req_to_offset(req, (int)m_tp.metadata().left());
@@ -3012,7 +3114,7 @@ we're still sending the metadata../src/metadata_transfer.cpp:359 | ||
relevance 0 | ../src/packet_buffer.cpp:176 | use compare_less_wrap for this comparison as well |
use compare_less_wrap for this comparison as well../src/packet_buffer.cpp:176 while (new_size < size)
+ | ||
relevance 0 | ../src/packet_buffer.cpp:176 | use compare_less_wrap for this comparison as well |
use compare_less_wrap for this comparison as well../src/packet_buffer.cpp:176 while (new_size < size)
new_size <<= 1;
void** new_storage = (void**)malloc(sizeof(void*) * new_size);
@@ -3063,7 +3165,7 @@ we're still sending the metadata../src/metadata_transfer.cpp:359 | ||
relevance 0 | ../src/part_file.cpp:252 | what do we do if someone is currently reading from the disk from this piece? does it matter? Since we won't actively erase the data from disk, but it may be overwritten soon, it's probably not that big of a deal |
what do we do if someone is currently reading from the disk
+ | ||
relevance 0 | ../src/part_file.cpp:252 | what do we do if someone is currently reading from the disk from this piece? does it matter? Since we won't actively erase the data from disk, but it may be overwritten soon, it's probably not that big of a deal |
what do we do if someone is currently reading from the disk
from this piece? does it matter? Since we won't actively erase the
data from disk, but it may be overwritten soon, it's probably not that
big of a deal../src/part_file.cpp:252 if (((mode & file::rw_mask) != file::read_only)
@@ -3117,7 +3219,7 @@ big of a deal../src/part_file.cpp:252relevance 0 | ../src/part_file.cpp:344 | instead of rebuilding the whole file header and flushing it, update the slot entries as we go |
|
instead of rebuilding the whole file header
+ | ||
relevance 0 | ../src/part_file.cpp:344 | instead of rebuilding the whole file header and flushing it, update the slot entries as we go |
instead of rebuilding the whole file header
and flushing it, update the slot entries as we go../src/part_file.cpp:344 if (block_to_copy == m_piece_size)
{
m_free_slots.push_back(i->second);
@@ -3169,7 +3271,7 @@ and flushing it, update the slot entries as we go../src/part_file.cpp:3
for (int piece = 0; piece < m_max_pieces; ++piece)
{
- | ||
relevance 0 | ../src/peer_connection.cpp:1115 | this should be the global download rate |
this should be the global download rate../src/peer_connection.cpp:1115
+ | ||
relevance 0 | ../src/peer_connection.cpp:1115 | this should be the global download rate |
this should be the global download rate../src/peer_connection.cpp:1115
int rate = 0;
// if we haven't received any data recently, the current download rate
@@ -3220,7 +3322,7 @@ and flushing it, update the slot entries as we go../src/part_file.cpp:3
if (!t) return;
t->received_bytes(bytes_payload, bytes_protocol);
}
- | ||
relevance 0 | ../src/peer_connection.cpp:3284 | sort the allowed fast set in priority order |
sort the allowed fast set in priority order../src/peer_connection.cpp:3284 m_allowed_fast.push_back(index);
+ | ||
relevance 0 | ../src/peer_connection.cpp:3294 | sort the allowed fast set in priority order |
sort the allowed fast set in priority order../src/peer_connection.cpp:3294 m_allowed_fast.push_back(index);
// if the peer has the piece and we want
// to download it, request it
@@ -3271,7 +3373,7 @@ and flushing it, update the slot entries as we go../src/part_file.cpp:3
TORRENT_ASSERT(t->has_picker());
TORRENT_ASSERT(t->picker().is_requested(block));
#endif
- | ||
relevance 0 | ../src/piece_picker.cpp:2407 | when expanding pieces for cache stripe reasons, the !downloading condition doesn't make much sense |
when expanding pieces for cache stripe reasons,
+ | ||
relevance 0 | ../src/piece_picker.cpp:2407 | when expanding pieces for cache stripe reasons, the !downloading condition doesn't make much sense |
when expanding pieces for cache stripe reasons,
the !downloading condition doesn't make much sense../src/piece_picker.cpp:2407 TORRENT_ASSERT(index < (int)m_piece_map.size() || m_piece_map.empty());
if (index+1 == (int)m_piece_map.size())
return m_blocks_in_last_piece;
@@ -3323,7 +3425,7 @@ the !downloading condition doesn't make much sense../src/piece_picker.c
// the second bool is true if this is the only active peer that is requesting
// and downloading blocks from this piece. Active means having a connection.
boost::tuple<bool, bool> requested_from(piece_picker::downloading_piece const& p
- | ||
relevance 0 | ../src/session_impl.cpp:678 | there's no rule here to make uTP connections not have the global or local rate limits apply to it. This used to be the default. |
there's no rule here to make uTP connections not have the global or
+ | ||
relevance 0 | ../src/session_impl.cpp:678 | there's no rule here to make uTP connections not have the global or local rate limits apply to it. This used to be the default. |
there's no rule here to make uTP connections not have the global or
local rate limits apply to it. This used to be the default.../src/session_impl.cpp:678 m_global_class = m_classes.new_peer_class("global");
m_tcp_peer_class = m_classes.new_peer_class("tcp");
m_local_peer_class = m_classes.new_peer_class("local");
@@ -3375,7 +3477,7 @@ local rate limits apply to it. This used to be the default.../src/sessi
get_thread_cpu_usage(&m_network_thread_cpu_usage);
- | ||
relevance 0 | ../src/session_impl.cpp:2384 | instead of having a special case for this, just make the default listen interfaces be "0.0.0.0:6881,[::1]:6881" and use the generic path. That would even allow for not listening at all. |
instead of having a special case for this, just make the
+ | ||
relevance 0 | ../src/session_impl.cpp:2384 | instead of having a special case for this, just make the default listen interfaces be "0.0.0.0:6881,[::1]:6881" and use the generic path. That would even allow for not listening at all. |
instead of having a special case for this, just make the
default listen interfaces be "0.0.0.0:6881,[::1]:6881" and use
the generic path. That would even allow for not listening at all.../src/session_impl.cpp:2384
// reset the retry counter
@@ -3428,7 +3530,7 @@ retry:
if (s.sock)
{
- | ||
relevance 0 | ../src/session_impl.cpp:3225 | should this function take a shared_ptr instead? |
should this function take a shared_ptr instead?../src/session_impl.cpp:3225 {
+ | ||
relevance 0 | ../src/session_impl.cpp:3225 | should this function take a shared_ptr instead? |
should this function take a shared_ptr instead?../src/session_impl.cpp:3225 {
#if defined TORRENT_ASIO_DEBUGGING
complete_async("session_impl::on_socks_accept");
#endif
@@ -3479,7 +3581,7 @@ retry:
TORRENT_ASSERT(p->is_disconnecting());
if (!p->is_choked() && !p->ignore_unchoke_slots()) --m_num_unchoked;
- | ||
relevance 0 | ../src/session_impl.cpp:3600 | have a separate list for these connections, instead of having to loop through all of them |
have a separate list for these connections, instead of having to loop through all of them../src/session_impl.cpp:3600 if (m_auto_manage_time_scaler < 0)
+ | ||
relevance 0 | ../src/session_impl.cpp:3600 | have a separate list for these connections, instead of having to loop through all of them |
have a separate list for these connections, instead of having to loop through all of them../src/session_impl.cpp:3600 if (m_auto_manage_time_scaler < 0)
{
INVARIANT_CHECK;
m_auto_manage_time_scaler = settings().get_int(settings_pack::auto_manage_interval);
@@ -3530,7 +3632,7 @@ retry:
#ifndef TORRENT_DISABLE_DHT
if (m_dht)
- | ||
relevance 0 | ../src/session_impl.cpp:3641 | this should apply to all bandwidth channels |
this should apply to all bandwidth channels../src/session_impl.cpp:3641 t.second_tick(tick_interval_ms, m_tick_residual / 1000);
+ | ||
relevance 0 | ../src/session_impl.cpp:3641 | this should apply to all bandwidth channels |
this should apply to all bandwidth channels../src/session_impl.cpp:3641 t.second_tick(tick_interval_ms, m_tick_residual / 1000);
// if the call to second_tick caused the torrent
// to no longer want to be ticked (i.e. it was
@@ -3581,7 +3683,7 @@ retry:
&& m_stat.upload_ip_overhead() >= up_limit
&& m_alerts.should_post<performance_alert>())
{
- | ||
relevance 0 | ../src/session_impl.cpp:4704 | these vectors could be copied from m_torrent_lists, if we would maintain them. That way the first pass over all torrents could be avoided. It would be especially efficient if most torrents are not auto-managed whenever we receive a scrape response (or anything that may change the rank of a torrent) that one torrent could re-sort itself in a list that's kept sorted at all times. That way, this pass over all torrents could be avoided alltogether. |
these vectors could be copied from m_torrent_lists,
+ | ||
relevance 0 | ../src/session_impl.cpp:4704 | these vectors could be copied from m_torrent_lists, if we would maintain them. That way the first pass over all torrents could be avoided. It would be especially efficient if most torrents are not auto-managed whenever we receive a scrape response (or anything that may change the rank of a torrent) that one torrent could re-sort itself in a list that's kept sorted at all times. That way, this pass over all torrents could be avoided alltogether. |
these vectors could be copied from m_torrent_lists,
if we would maintain them. That way the first pass over
all torrents could be avoided. It would be especially
efficient if most torrents are not auto-managed
@@ -3640,7 +3742,7 @@ avoided alltogether.../src/session_impl.cpp:4704relevance 0 | ../src/session_impl.cpp:4779 | allow extensions to sort torrents for queuing |
|
allow extensions to sort torrents for queuing../src/session_impl.cpp:4779 if (t->is_finished())
+ | ||
relevance 0 | ../src/session_impl.cpp:4779 | allow extensions to sort torrents for queuing |
allow extensions to sort torrents for queuing../src/session_impl.cpp:4779 if (t->is_finished())
seeds.push_back(t);
else
downloaders.push_back(t);
@@ -3691,7 +3793,7 @@ avoided alltogether.../src/session_impl.cpp:4704relevance 0 | ../src/session_impl.cpp:4957 | use a lower limit than m_settings.connections_limit to allocate the to 10% or so of connection slots for incoming connections |
|
use a lower limit than m_settings.connections_limit
+ | ||
relevance 0 | ../src/session_impl.cpp:4957 | use a lower limit than m_settings.connections_limit to allocate the to 10% or so of connection slots for incoming connections |
use a lower limit than m_settings.connections_limit
to allocate the to 10% or so of connection slots for incoming
connections../src/session_impl.cpp:4957 // if we don't have any free slots, return
if (free_slots <= -m_half_open.limit()) return;
@@ -3744,7 +3846,7 @@ connections../src/session_impl.cpp:4957relevance 0 | ../src/session_impl.cpp:5119 | post a message to have this happen immediately instead of waiting for the next tick |
|
post a message to have this happen
+ | ||
relevance 0 | ../src/session_impl.cpp:5119 | post a message to have this happen immediately instead of waiting for the next tick |
post a message to have this happen
immediately instead of waiting for the next tick../src/session_impl.cpp:5119 {
// we've unchoked this peer, and it hasn't reciprocated
// we may want to increase our estimated reciprocation rate
@@ -3796,7 +3898,7 @@ immediately instead of waiting for the next tick../src/session_impl.cpp
prev = i;
}
#endif
- | ||
relevance 0 | ../src/session_impl.cpp:5153 | make configurable |
make configurable../src/session_impl.cpp:5153
+ | ||
relevance 0 | ../src/session_impl.cpp:5153 | make configurable |
make configurable../src/session_impl.cpp:5153
#ifdef TORRENT_DEBUG
for (std::vector<peer_connection*>::const_iterator i = peers.begin()
, end(peers.end()), prev(peers.end()); i != end; ++i)
@@ -3829,7 +3931,7 @@ immediately instead of waiting for the next tick../src/session_impl.cpp
++m_allowed_upload_slots;
- | ||
relevance 0 | ../src/session_impl.cpp:5167 | make configurable |
make configurable../src/session_impl.cpp:5167 >= (*i)->uploaded_in_last_round() * 1000
+ | ||
relevance 0 | ../src/session_impl.cpp:5167 | make configurable |
make configurable../src/session_impl.cpp:5167 >= (*i)->uploaded_in_last_round() * 1000
* (1 + t2->priority()) / total_milliseconds(unchoke_interval));
}
prev = i;
@@ -3880,7 +3982,7 @@ immediately instead of waiting for the next tick../src/session_impl.cpp
{
// if our current upload rate is less than 90% of our
// limit
- | ||
relevance 0 | ../src/session_impl.cpp:5246 | this should be called for all peers! |
this should be called for all peers!../src/session_impl.cpp:5246 // measurement of the peak, use that + 10kB/s, otherwise
+ | ||
relevance 0 | ../src/session_impl.cpp:5246 | this should be called for all peers! |
this should be called for all peers!../src/session_impl.cpp:5246 // measurement of the peak, use that + 10kB/s, otherwise
// assume 20 kB/s
upload_capacity_left = (std::max)(20000, m_peak_up_rate + 10000);
if (m_alerts.should_post<performance_alert>())
@@ -3931,7 +4033,7 @@ immediately instead of waiting for the next tick../src/session_impl.cpp
--unchoke_set_size;
++m_num_unchoked;
- | ||
relevance 0 | ../src/session_impl.cpp:5663 | it might be a nice feature here to limit the number of torrents to send in a single update. By just posting the first n torrents, they would nicely be round-robined because the torrent lists are always pushed back |
it might be a nice feature here to limit the number of torrents
+ | ||
relevance 0 | ../src/session_impl.cpp:5663 | it might be a nice feature here to limit the number of torrents to send in a single update. By just posting the first n torrents, they would nicely be round-robined because the torrent lists are always pushed back |
it might be a nice feature here to limit the number of torrents
to send in a single update. By just posting the first n torrents, they
would nicely be round-robined because the torrent lists are always
pushed back../src/session_impl.cpp:5663 t->status(&*i, flags);
@@ -3984,7 +4086,7 @@ pushed back../src/session_impl.cpp:5663relevance 0 | ../src/storage.cpp:710 | make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info |
|
make this more generic to not just work if files have been
+ | ||
relevance 0 | ../src/storage.cpp:710 | make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info |
make this more generic to not just work if files have been
renamed, but also if they have been merged into a single file for instance
maybe use the same format as .torrent files and reuse some code from torrent_info../src/storage.cpp:710 for (;;)
{
@@ -4037,7 +4139,7 @@ maybe use the same format as .torrent files and reuse some code from torrent_inf
if (file_sizes_ent->list_size() == 0)
{
ec.ec = errors::no_files_in_resume_data;
- | ||
relevance 0 | ../src/storage.cpp:1006 | if everything moves OK, except for the partfile we currently won't update the save path, which breaks things. it would probably make more sense to give up on the partfile |
if everything moves OK, except for the partfile
+ | ||
relevance 0 | ../src/storage.cpp:1006 | if everything moves OK, except for the partfile we currently won't update the save path, which breaks things. it would probably make more sense to give up on the partfile |
if everything moves OK, except for the partfile
we currently won't update the save path, which breaks things.
it would probably make more sense to give up on the partfile../src/storage.cpp:1006 if (ec)
{
@@ -4090,8 +4192,8 @@ it would probably make more sense to give up on the partfile../src/stor
{
fileop op = { &file::writev
, file::read_write | flags };
- | ||
relevance 0 | ../src/torrent.cpp:489 | if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it. |
if the existing torrent doesn't have metadata, insert
-the metadata we just downloaded into it.../src/torrent.cpp:489
+ | ||
relevance 0 | ../src/torrent.cpp:491 | if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it. |
if the existing torrent doesn't have metadata, insert
+the metadata we just downloaded into it.../src/torrent.cpp:491
m_torrent_file = tf;
// now, we might already have this torrent in the session.
@@ -4142,8 +4244,8 @@ the metadata we just downloaded into it.../src/torrent.cpp:489 | ||
relevance 0 | ../src/torrent.cpp:639 | if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it. |
if the existing torrent doesn't have metadata, insert
-the metadata we just downloaded into it.../src/torrent.cpp:639
+ | ||
relevance 0 | ../src/torrent.cpp:641 | if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it. |
if the existing torrent doesn't have metadata, insert
+the metadata we just downloaded into it.../src/torrent.cpp:641
m_torrent_file = tf;
// now, we might already have this torrent in the session.
@@ -4194,12 +4296,12 @@ the metadata we just downloaded into it.../src/torrent.cpp:639 | ||
relevance 0 | ../src/torrent.cpp:1444 | is verify_peer_cert called once per certificate in the chain, and this function just tells us which depth we're at right now? If so, the comment makes sense. any certificate that isn't the leaf (i.e. the one presented by the peer) should be accepted automatically, given preverified is true. The leaf certificate need to be verified to make sure its DN matches the info-hash |
is verify_peer_cert called once per certificate in the chain, and
+ | ||
relevance 0 | ../src/torrent.cpp:1446 | is verify_peer_cert called once per certificate in the chain, and this function just tells us which depth we're at right now? If so, the comment makes sense. any certificate that isn't the leaf (i.e. the one presented by the peer) should be accepted automatically, given preverified is true. The leaf certificate need to be verified to make sure its DN matches the info-hash |
is verify_peer_cert called once per certificate in the chain, and
this function just tells us which depth we're at right now? If so, the comment
makes sense.
any certificate that isn't the leaf (i.e. the one presented by the peer)
should be accepted automatically, given preverified is true. The leaf certificate
-need to be verified to make sure its DN matches the info-hash../src/torrent.cpp:1444 if (pp) p->add_extension(pp);
+need to be verified to make sure its DN matches the info-hash../src/torrent.cpp:1446 if (pp) p->add_extension(pp);
}
// if files are checked for this torrent, call the extension
@@ -4250,8 +4352,8 @@ need to be verified to make sure its DN matches the info-hash../src/tor
{
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
match = true;
- | ||
relevance 0 | ../src/torrent.cpp:1836 | instead of creating the picker up front here, maybe this whole section should move to need_picker() |
instead of creating the picker up front here,
-maybe this whole section should move to need_picker()../src/torrent.cpp:1836 else
+ | ||
relevance 0 | ../src/torrent.cpp:1838 | instead of creating the picker up front here, maybe this whole section should move to need_picker() |
instead of creating the picker up front here,
+maybe this whole section should move to need_picker()../src/torrent.cpp:1838 else
{
read_resume_data(m_resume_data->entry);
}
@@ -4302,10 +4404,10 @@ maybe this whole section should move to need_picker()../src/torrent.cpp
// need to consider it finished
std::vector<piece_picker::downloading_piece> dq
- | ||
relevance 0 | ../src/torrent.cpp:2032 | there may be peer extensions relying on the torrent extension still being alive. Only do this if there are no peers. And when the last peer is disconnected, if the torrent is unloaded, clear the extensions m_extensions.clear(); |
there may be peer extensions relying on the torrent extension
+ | ||
relevance 0 | ../src/torrent.cpp:2034 | there may be peer extensions relying on the torrent extension still being alive. Only do this if there are no peers. And when the last peer is disconnected, if the torrent is unloaded, clear the extensions m_extensions.clear(); |
there may be peer extensions relying on the torrent extension
still being alive. Only do this if there are no peers. And when the last peer
is disconnected, if the torrent is unloaded, clear the extensions
-m_extensions.clear();../src/torrent.cpp:2032 // pinned torrents are not allowed to be swapped out
+m_extensions.clear();../src/torrent.cpp:2034 // pinned torrents are not allowed to be swapped out
TORRENT_ASSERT(!m_pinned);
m_should_be_loaded = false;
@@ -4356,9 +4458,9 @@ m_extensions.clear();../src/torrent.cpp:2032relevance 0 | ../src/torrent.cpp:2705 | this pattern is repeated in a few places. Factor this into a function and generalize the concept of a torrent having a dedicated listen port |
|
this pattern is repeated in a few places. Factor this into
+ | ||
relevance 0 | ../src/torrent.cpp:2707 | this pattern is repeated in a few places. Factor this into a function and generalize the concept of a torrent having a dedicated listen port |
this pattern is repeated in a few places. Factor this into
a function and generalize the concept of a torrent having a
-dedicated listen port../src/torrent.cpp:2705 // if the files haven't been checked yet, we're
+dedicated listen port../src/torrent.cpp:2707 // if the files haven't been checked yet, we're
// not ready for peers. Except, if we don't have metadata,
// we need peers to download from
if (!m_files_checked && valid_metadata()) return;
@@ -4409,8 +4511,8 @@ dedicated listen port../src/torrent.cpp:2705 | ||
relevance 0 | ../src/torrent.cpp:3236 | instead, borrow host resolvers from a pool in session_impl. That would make the torrent object smaller |
instead, borrow host resolvers from a pool in session_impl. That
-would make the torrent object smaller../src/torrent.cpp:3236 , boost::bind(&torrent::on_i2p_resolve
+ | ||
relevance 0 | ../src/torrent.cpp:3238 | instead, borrow host resolvers from a pool in session_impl. That would make the torrent object smaller |
instead, borrow host resolvers from a pool in session_impl. That
+would make the torrent object smaller../src/torrent.cpp:3238 , boost::bind(&torrent::on_i2p_resolve
, shared_from_this(), _1));
*/
// it seems like you're not supposed to do a name lookup
@@ -4461,7 +4563,7 @@ would make the torrent object smaller../src/torrent.cpp:3236 | ||
relevance 0 | ../src/torrent.cpp:4427 | update suggest_piece? |
update suggest_piece?../src/torrent.cpp:4427
+ | ||
relevance 0 | ../src/torrent.cpp:4429 | update suggest_piece? |
update suggest_piece?../src/torrent.cpp:4429
void torrent::peer_has_all(peer_connection const* peer)
{
if (has_picker())
@@ -4512,8 +4614,8 @@ would make the torrent object smaller../src/torrent.cpp:3236 | ||
relevance 0 | ../src/torrent.cpp:4570 | really, we should just keep the picker around in this case to maintain the availability counters |
really, we should just keep the picker around
-in this case to maintain the availability counters../src/torrent.cpp:4570 pieces.reserve(cs.pieces.size());
+ | ||
relevance 0 | ../src/torrent.cpp:4572 | really, we should just keep the picker around in this case to maintain the availability counters |
really, we should just keep the picker around
+in this case to maintain the availability counters../src/torrent.cpp:4572 pieces.reserve(cs.pieces.size());
// sort in ascending order, to get most recently used first
std::sort(cs.pieces.begin(), cs.pieces.end()
@@ -4564,12 +4666,12 @@ in this case to maintain the availability counters../src/torrent.cpp:45
}
void torrent::abort()
- | ||
relevance 0 | ../src/torrent.cpp:6480 | make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info The mapped_files needs to be read both in the network thread and in the disk thread, since they both have their own mapped files structures which are kept in sync |
make this more generic to not just work if files have been
+ | ||
relevance 0 | ../src/torrent.cpp:6478 | make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance maybe use the same format as .torrent files and reuse some code from torrent_info The mapped_files needs to be read both in the network thread and in the disk thread, since they both have their own mapped files structures which are kept in sync |
make this more generic to not just work if files have been
renamed, but also if they have been merged into a single file for instance
maybe use the same format as .torrent files and reuse some code from torrent_info
The mapped_files needs to be read both in the network thread
and in the disk thread, since they both have their own mapped files structures
-which are kept in sync../src/torrent.cpp:6480 m_last_upload = rd.dict_find_int_value("last_upload", 0);
+which are kept in sync../src/torrent.cpp:6478 super_seeding(rd.dict_find_int_value("super_seeding", 0));
if (!m_use_resume_save_path)
{
@@ -4620,12 +4722,12 @@ which are kept in sync../src/torrent.cpp:6480relevance 0 | ../src/torrent.cpp:6643 | if this is a merkle torrent and we can't restore the tree, we need to wipe all the bits in the have array, but not necessarily we might want to do a full check to see if we have all the pieces. This is low priority since almost no one uses merkle torrents |
|
if this is a merkle torrent and we can't
+ | ||
relevance 0 | ../src/torrent.cpp:6641 | if this is a merkle torrent and we can't restore the tree, we need to wipe all the bits in the have array, but not necessarily we might want to do a full check to see if we have all the pieces. This is low priority since almost no one uses merkle torrents |
if this is a merkle torrent and we can't
restore the tree, we need to wipe all the
bits in the have array, but not necessarily
we might want to do a full check to see if we have
all the pieces. This is low priority since almost
-no one uses merkle torrents../src/torrent.cpp:6643 add_web_seed(url, web_seed_entry::http_seed);
+no one uses merkle torrents../src/torrent.cpp:6641 add_web_seed(url, web_seed_entry::http_seed);
}
}
@@ -4673,12 +4775,12 @@ no one uses merkle torrents../src/torrent.cpp:6643 | ||
relevance 0 | ../src/torrent.cpp:6837 | make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance. using file_base |
make this more generic to not just work if files have been
+ ret["active_time"] = active_time();
+ ret["finished_time"] = finished_time();
+ ret["seeding_time"] = seeding_time();
+ | ||
relevance 0 | ../src/torrent.cpp:6831 | make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance. using file_base |
make this more generic to not just work if files have been
renamed, but also if they have been merged into a single file for instance.
-using file_base../src/torrent.cpp:6837 pieces.resize(m_torrent_file->num_pieces());
+using file_base../src/torrent.cpp:6831 pieces.resize(m_torrent_file->num_pieces());
if (!has_picker())
{
std::memset(&pieces[0], m_have_all, pieces.size());
@@ -4729,9 +4831,9 @@ using file_base../src/torrent.cpp:6837relevance 0 | ../src/torrent.cpp:8765 | add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file |
|
add a flag to ignore stats, and only care about resume data for
+ | ||
relevance 0 | ../src/torrent.cpp:8790 | add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file |
add a flag to ignore stats, and only care about resume data for
content. For unchanged files, don't trigger a load of the metadata
-just to save an empty resume data file../src/torrent.cpp:8765 if (m_complete != 0xffffff) seeds = m_complete;
+just to save an empty resume data file../src/torrent.cpp:8790 if (m_complete != 0xffffff) seeds = m_complete;
else seeds = m_policy ? m_policy->num_seeds() : 0;
if (m_incomplete != 0xffffff) downloaders = m_incomplete;
@@ -4782,10 +4884,10 @@ just to save an empty resume data file../src/torrent.cpp:8765 | ||
relevance 0 | ../src/torrent.cpp:9708 | go through the pieces we have and count the total number of downloaders we have. Only count peers that are interested in us since some peers might not send have messages for pieces we have it num_interested == 0, we need to pick a new piece |
go through the pieces we have and count the total number
+ | ||
relevance 0 | ../src/torrent.cpp:9758 | go through the pieces we have and count the total number of downloaders we have. Only count peers that are interested in us since some peers might not send have messages for pieces we have it num_interested == 0, we need to pick a new piece |
go through the pieces we have and count the total number
of downloaders we have. Only count peers that are interested in us
since some peers might not send have messages for pieces we have
-it num_interested == 0, we need to pick a new piece../src/torrent.cpp:9708 }
+it num_interested == 0, we need to pick a new piece../src/torrent.cpp:9758 }
rarest_pieces.clear();
rarest_rarity = pp.peer_count;
@@ -4836,8 +4938,8 @@ it num_interested == 0, we need to pick a new piece../src/torrent.cpp:9
if (num_cache_pieces > m_torrent_file->num_pieces())
num_cache_pieces = m_torrent_file->num_pieces();
- | ||
relevance 0 | ../src/torrent.cpp:10354 | instead of resorting the whole list, insert the peers directly into the right place |
instead of resorting the whole list, insert the peers
-directly into the right place../src/torrent.cpp:10354 printf("timed out [average-piece-time: %d ms ]\n"
+ | ||
relevance 0 | ../src/torrent.cpp:10404 | instead of resorting the whole list, insert the peers directly into the right place |
instead of resorting the whole list, insert the peers
+directly into the right place../src/torrent.cpp:10404 printf("timed out [average-piece-time: %d ms ]\n"
, m_average_piece_time);
#endif
}
@@ -4888,7 +4990,7 @@ directly into the right place../src/torrent.cpp:10354relevance 0 | ../src/torrent_peer.cpp:179 | how do we deal with our external address changing? |
|
how do we deal with our external address changing?../src/torrent_peer.cpp:179 , is_v6_addr(false)
+ | ||
relevance 0 | ../src/torrent_peer.cpp:179 | how do we deal with our external address changing? |
how do we deal with our external address changing?../src/torrent_peer.cpp:179 , is_v6_addr(false)
#endif
#if TORRENT_USE_I2P
, is_i2p_addr(false)
@@ -4939,7 +5041,7 @@ directly into the right place../src/torrent.cpp:10354relevance 0 | ../src/udp_socket.cpp:290 | it would be nice to detect this on posix systems also |
|
it would be nice to detect this on posix systems also../src/udp_socket.cpp:290 --m_v6_outstanding;
+ | ||
relevance 0 | ../src/udp_socket.cpp:290 | it would be nice to detect this on posix systems also |
it would be nice to detect this on posix systems also../src/udp_socket.cpp:290 --m_v6_outstanding;
}
else
#endif
@@ -4990,7 +5092,7 @@ void udp_socket::call_handler(error_code const& ec, udp::endpoint const&
ret = (*i)->incoming_packet(ec, ep, buf, size);
} TORRENT_CATCH (std::exception&) {}
if (*i == NULL) i = m_observers.erase(i);
- | ||
relevance 0 | ../src/udp_tracker_connection.cpp:554 | it would be more efficient to not use a string here. however, the problem is that some trackers will respond with actual strings. For example i2p trackers |
it would be more efficient to not use a string here.
+ | ||
relevance 0 | ../src/udp_tracker_connection.cpp:554 | it would be more efficient to not use a string here. however, the problem is that some trackers will respond with actual strings. For example i2p trackers |
it would be more efficient to not use a string here.
however, the problem is that some trackers will respond
with actual strings. For example i2p trackers../src/udp_tracker_connection.cpp:554 }
@@ -5043,7 +5145,7 @@ with actual strings. For example i2p trackers../src/udp_tracker_connect
{
restart_read_timeout();
int action = detail::read_int32(buf);
- | ||
relevance 0 | ../src/upnp.cpp:72 | listen_interface is not used. It's meant to bind the broadcast socket |
listen_interface is not used. It's meant to bind the broadcast socket../src/upnp.cpp:72#include <asio/ip/multicast.hpp>
+ | ||
relevance 0 | ../src/upnp.cpp:72 | listen_interface is not used. It's meant to bind the broadcast socket |
listen_interface is not used. It's meant to bind the broadcast socket../src/upnp.cpp:72#include <asio/ip/multicast.hpp>
#else
#include <boost/asio/ip/host_name.hpp>
#include <boost/asio/ip/multicast.hpp>
@@ -5094,7 +5196,7 @@ static error_code ec;
upnp_state_t* s = (upnp_state_t*)state;
m_devices.swap(s->devices);
m_mappings.swap(s->mappings);
- | ||
relevance 0 | ../src/ut_metadata.cpp:320 | we really need to increment the refcounter on the torrent while this buffer is still in the peer's send buffer |
we really need to increment the refcounter on the torrent
+ | ||
relevance 0 | ../src/ut_metadata.cpp:320 | we really need to increment the refcounter on the torrent while this buffer is still in the peer's send buffer |
we really need to increment the refcounter on the torrent
while this buffer is still in the peer's send buffer../src/ut_metadata.cpp:320 if (!m_tp.need_loaded()) return;
metadata = m_tp.metadata().begin + offset;
metadata_piece_size = (std::min)(
@@ -5146,7 +5248,7 @@ while this buffer is still in the peer's send buffer../src/ut_metadata.
#ifdef TORRENT_VERBOSE_LOGGING
m_pc.peer_log("<== UT_METADATA [ not a dictionary ]");
#endif
- | ||
relevance 0 | ../src/utp_stream.cpp:1627 | this loop may not be very efficient |
this loop may not be very efficient../src/utp_stream.cpp:1627
+ | ||
relevance 0 | ../src/utp_stream.cpp:1627 | this loop may not be very efficient |
this loop may not be very efficient../src/utp_stream.cpp:1627
char* m_buf;
};
@@ -5197,7 +5299,7 @@ bool utp_socket_impl::send_pkt(int flags)
if (sack > 32) sack = 32;
}
- | ||
relevance 0 | ../src/web_connection_base.cpp:71 | introduce a web-seed default class which has a low download priority |
introduce a web-seed default class which has a low download priority../src/web_connection_base.cpp:71
+ | ||
relevance 0 | ../src/web_connection_base.cpp:71 | introduce a web-seed default class which has a low download priority |
introduce a web-seed default class which has a low download priority../src/web_connection_base.cpp:71
namespace libtorrent
{
web_connection_base::web_connection_base(
@@ -5248,7 +5350,7 @@ namespace libtorrent
// according to the settings.
return m_settings.get_int(settings_pack::urlseed_timeout);
}
- | ||
relevance 0 | ../src/kademlia/dht_tracker.cpp:428 | ideally this function would be called when the put completes |
ideally this function would be called when the
+ | ||
relevance 0 | ../src/kademlia/dht_tracker.cpp:428 | ideally this function would be called when the put completes |
ideally this function would be called when the
put completes../src/kademlia/dht_tracker.cpp:428 // since it controls whether we re-put the content
TORRENT_ASSERT(!it.is_mutable());
f(it);
@@ -5300,7 +5402,7 @@ put completes../src/kademlia/dht_tracker.cpp:428relevance 0 | ../src/kademlia/routing_table.cpp:308 | instad of refreshing a bucket by using find_nodes, ping each node periodically |
|
instad of refreshing a bucket by using find_nodes,
+ | ||
relevance 0 | ../src/kademlia/routing_table.cpp:308 | instad of refreshing a bucket by using find_nodes, ping each node periodically |
instad of refreshing a bucket by using find_nodes,
ping each node periodically../src/kademlia/routing_table.cpp:308 os << "]\n";
}
}
@@ -5352,7 +5454,7 @@ bool compare_bucket_refresh(routing_table_node const& lhs, routing_table_nod
node_id mask = generate_prefix_mask(num_bits);
// target = (target & ~mask) | (root & mask)
- | ||
relevance 0 | ../include/libtorrent/bitfield.hpp:158 | rename to data() ? |
rename to data() ?../include/libtorrent/bitfield.hpp:158 if (m_buf[i] != 0) return false;
+ | ||
relevance 0 | ../include/libtorrent/bitfield.hpp:158 | rename to data() ? |
rename to data() ?../include/libtorrent/bitfield.hpp:158 if (m_buf[i] != 0) return false;
}
return true;
}
@@ -5403,7 +5505,7 @@ bool compare_bucket_refresh(routing_table_node const& lhs, routing_table_nod
return ret;
}
#endif // TORRENT_HAS_SSE
- | ||
relevance 0 | ../include/libtorrent/block_cache.hpp:220 | make this 32 bits and to count seconds since the block cache was created |
make this 32 bits and to count seconds since the block cache was created../include/libtorrent/block_cache.hpp:220
+ | ||
relevance 0 | ../include/libtorrent/block_cache.hpp:220 | make this 32 bits and to count seconds since the block cache was created |
make this 32 bits and to count seconds since the block cache was created../include/libtorrent/block_cache.hpp:220
bool operator==(cached_piece_entry const& rhs) const
{ return storage.get() == rhs.storage.get() && piece == rhs.piece; }
@@ -5454,7 +5556,7 @@ bool compare_bucket_refresh(routing_table_node const& lhs, routing_table_nod
// this is set to true once we flush blocks past
// the hash cursor. Once this happens, there's
- | ||
relevance 0 | ../include/libtorrent/config.hpp:339 | Make this count Unicode characters instead of bytes on windows |
Make this count Unicode characters instead of bytes on windows../include/libtorrent/config.hpp:339#define TORRENT_USE_WRITEV 0
+ | ||
relevance 0 | ../include/libtorrent/config.hpp:339 | Make this count Unicode characters instead of bytes on windows |
Make this count Unicode characters instead of bytes on windows../include/libtorrent/config.hpp:339#define TORRENT_USE_WRITEV 0
#define TORRENT_USE_READV 0
#else
@@ -5505,7 +5607,7 @@ bool compare_bucket_refresh(routing_table_node const& lhs, routing_table_nod
#include <stdarg.h>
// internal
- | ||
relevance 0 | ../include/libtorrent/debug.hpp:212 | rewrite this class to use FILE* instead and have a printf-like interface |
rewrite this class to use FILE* instead and
+ | ||
relevance 0 | ../include/libtorrent/debug.hpp:212 | rewrite this class to use FILE* instead and have a printf-like interface |
rewrite this class to use FILE* instead and
have a printf-like interface../include/libtorrent/debug.hpp:212#endif
}
@@ -5557,7 +5659,7 @@ namespace libtorrent
mutex::scoped_lock l(file_mutex);
open(!append);
- | ||
relevance 0 | ../include/libtorrent/disk_buffer_pool.hpp:133 | try to remove the observers, only using the async_allocate handlers |
try to remove the observers, only using the async_allocate handlers../include/libtorrent/disk_buffer_pool.hpp:133
+ | ||
relevance 0 | ../include/libtorrent/disk_buffer_pool.hpp:133 | try to remove the observers, only using the async_allocate handlers |
try to remove the observers, only using the async_allocate handlers../include/libtorrent/disk_buffer_pool.hpp:133
// number of bytes per block. The BitTorrent
// protocol defines the block size to 16 KiB.
const int m_block_size;
@@ -5608,7 +5710,7 @@ namespace libtorrent
// the pointer to the block of virtual address space
// making up the mmapped cache space
char* m_cache_pool;
- | ||
relevance 0 | ../include/libtorrent/peer_connection.hpp:217 | make this a raw pointer (to save size in the first cache line) and make the constructor take a raw pointer. torrent objects should always outlive their peers |
make this a raw pointer (to save size in
+ | ||
relevance 0 | ../include/libtorrent/peer_connection.hpp:217 | make this a raw pointer (to save size in the first cache line) and make the constructor take a raw pointer. torrent objects should always outlive their peers |
make this a raw pointer (to save size in
the first cache line) and make the constructor
take a raw pointer. torrent objects should always
outlive their peers../include/libtorrent/peer_connection.hpp:217 , m_snubbed(false)
@@ -5662,7 +5764,7 @@ outlive their peers../include/libtorrent/peer_connection.hpp:217 | ||
relevance 0 | ../include/libtorrent/peer_connection.hpp:1141 | factor this out into its own class with a virtual interface torrent and session should implement this interface |
factor this out into its own class with a virtual interface
+ | ||
relevance 0 | ../include/libtorrent/peer_connection.hpp:1141 | factor this out into its own class with a virtual interface torrent and session should implement this interface |
factor this out into its own class with a virtual interface
torrent and session should implement this interface../include/libtorrent/peer_connection.hpp:1141
// the local endpoint for this peer, i.e. our address
// and our port. If this is set for outgoing connections
@@ -5714,7 +5816,7 @@ torrent and session should implement this interface../include/libtorren
// |
// | m_recv_start (logical start of current
// | | receive buffer, as perceived by upper layers)
- | ||
relevance 0 | ../include/libtorrent/peer_connection_interface.hpp:45 | make this interface smaller! |
make this interface smaller!../include/libtorrent/peer_connection_interface.hpp:45SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ | ||
relevance 0 | ../include/libtorrent/peer_connection_interface.hpp:45 | make this interface smaller! |
make this interface smaller!../include/libtorrent/peer_connection_interface.hpp:45SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
@@ -5765,7 +5867,7 @@ namespace libtorrent
virtual tcp::endpoint const& remote() const = 0;
virtual tcp::endpoint local_endpoint() const = 0;
virtual void disconnect(error_code const& ec, operation_t op, int error = 0) = 0;
- | ||
relevance 0 | ../include/libtorrent/performance_counters.hpp:132 | should keepalives be in here too? how about dont-have, share-mode, upload-only |
should keepalives be in here too?
+ | ||
relevance 0 | ../include/libtorrent/performance_counters.hpp:132 | should keepalives be in here too? how about dont-have, share-mode, upload-only |
should keepalives be in here too?
how about dont-have, share-mode, upload-only../include/libtorrent/performance_counters.hpp:132 // a connect candidate
connection_attempt_loops,
// successful incoming connections (not rejected for any reason)
@@ -5817,7 +5919,7 @@ how about dont-have, share-mode, upload-only../include/libtorrent/perfo
num_outgoing_cancel,
num_outgoing_dht_port,
num_outgoing_suggest,
- | ||
relevance 0 | ../include/libtorrent/performance_counters.hpp:404 | some space could be saved here by making gauges 32 bits |
some space could be saved here by making gauges 32 bits../include/libtorrent/performance_counters.hpp:404 limiter_down_bytes,
+ | ||
relevance 0 | ../include/libtorrent/performance_counters.hpp:404 | some space could be saved here by making gauges 32 bits |
some space could be saved here by making gauges 32 bits../include/libtorrent/performance_counters.hpp:404 limiter_down_bytes,
num_counters,
num_gauge_counters = num_counters - num_stats_counters
@@ -5850,7 +5952,7 @@ how about dont-have, share-mode, upload-only../include/libtorrent/perfo
#endif
- | ||
relevance 0 | ../include/libtorrent/piece_picker.hpp:669 | should this be allocated lazily? |
should this be allocated lazily?../include/libtorrent/piece_picker.hpp:669 std::vector<downloading_piece>::const_iterator find_dl_piece(int queue, int index) const;
+ | ||
relevance 0 | ../include/libtorrent/piece_picker.hpp:669 | should this be allocated lazily? |
should this be allocated lazily?../include/libtorrent/piece_picker.hpp:669 std::vector<downloading_piece>::const_iterator find_dl_piece(int queue, int index) const;
std::vector<downloading_piece>::iterator find_dl_piece(int queue, int index);
// returns an iterator to the downloading piece, whichever
@@ -5901,7 +6003,7 @@ how about dont-have, share-mode, upload-only../include/libtorrent/perfo
// and some are still in the requested state
// 2: downloading pieces where every block is
// finished or writing
- | ||
relevance 0 | ../include/libtorrent/proxy_base.hpp:166 | it would be nice to remember the bind port and bind once we know where the proxy is m_sock.bind(endpoint, ec); |
it would be nice to remember the bind port and bind once we know where the proxy is
+ | ||
relevance 0 | ../include/libtorrent/proxy_base.hpp:166 | it would be nice to remember the bind port and bind once we know where the proxy is m_sock.bind(endpoint, ec); |
it would be nice to remember the bind port and bind once we know where the proxy is
m_sock.bind(endpoint, ec);../include/libtorrent/proxy_base.hpp:166 {
return m_sock.get_option(opt, ec);
}
@@ -5953,7 +6055,7 @@ m_sock.bind(endpoint, ec);../include/libtorrent/proxy_base.hpp:166
m_sock.close(ec);
m_resolver.cancel();
}
- | ||
relevance 0 | ../include/libtorrent/session.hpp:856 | add get_peer_class_type_filter() as well |
add get_peer_class_type_filter() as well../include/libtorrent/session.hpp:856 //
+ | ||
relevance 0 | ../include/libtorrent/session.hpp:856 | add get_peer_class_type_filter() as well |
add get_peer_class_type_filter() as well../include/libtorrent/session.hpp:856 //
// The ``peer_class`` argument cannot be greater than 31. The bitmasks
// representing peer classes in the ``peer_class_filter`` are 32 bits.
//
@@ -6004,7 +6106,7 @@ m_sock.bind(endpoint, ec);../include/libtorrent/proxy_base.hpp:166
// destructs.
//
// For more information on peer classes, see peer-classes_.
- | ||
relevance 0 | ../include/libtorrent/settings_pack.hpp:1074 | deprecate this ``max_rejects`` is the number of piece requests we will reject in a row while a peer is choked before the peer is considered abusive and is disconnected. |
deprecate this
+ | ||
relevance 0 | ../include/libtorrent/settings_pack.hpp:1074 | deprecate this ``max_rejects`` is the number of piece requests we will reject in a row while a peer is choked before the peer is considered abusive and is disconnected. |
deprecate this
``max_rejects`` is the number of piece requests we will reject in a row
while a peer is choked before the peer is considered abusive and is
disconnected.../include/libtorrent/settings_pack.hpp:1074 auto_manage_startup,
@@ -6058,7 +6160,7 @@ disconnected.../include/libtorrent/settings_pack.hpp:1074 | ||
relevance 0 | ../include/libtorrent/size_type.hpp:48 | remove these and just use boost's types directly |
remove these and just use boost's types directly../include/libtorrent/size_type.hpp:48ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ | ||
relevance 0 | ../include/libtorrent/size_type.hpp:48 | remove these and just use boost's types directly |
remove these and just use boost's types directly../include/libtorrent/size_type.hpp:48ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
@@ -6084,7 +6186,7 @@ namespace libtorrent
#endif
- | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1190 | this wastes 5 bits per file |
this wastes 5 bits per file../include/libtorrent/torrent.hpp:1190#ifndef TORRENT_DISABLE_EXTENSIONS
+ | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1194 | this wastes 5 bits per file |
this wastes 5 bits per file../include/libtorrent/torrent.hpp:1194#ifndef TORRENT_DISABLE_EXTENSIONS
typedef std::list<boost::shared_ptr<torrent_plugin> > extension_list_t;
extension_list_t m_extensions;
#endif
@@ -6135,7 +6237,7 @@ namespace libtorrent
// if this was added from an RSS feed, this is the unique
// identifier in the feed.
- | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1249 | These two bitfields should probably be coalesced into one |
These two bitfields should probably be coalesced into one../include/libtorrent/torrent.hpp:1249 // the .torrent file from m_url
+ | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1253 | These two bitfields should probably be coalesced into one |
These two bitfields should probably be coalesced into one../include/libtorrent/torrent.hpp:1253 // the .torrent file from m_url
// std::vector<char> m_torrent_file_buf;
// this is a list of all pieces that we have announced
@@ -6186,7 +6288,82 @@ namespace libtorrent
// this is the time last any of our peers saw a seed
// in this swarm
time_t m_swarm_last_seen_complete;
- | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1591 | there's space for 1 bits here |
there's space for 1 bits here../include/libtorrent/torrent.hpp:1591
+ | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1571 | There are 8 bits free here |
There are 8 bits free here../include/libtorrent/torrent.hpp:1571 // files belonging to it. When set, don't write any
+ // more blocks to disk!
+ bool m_deleted:1;
+
+ // pinned torrents are locked in RAM and won't be unloaded
+ // in favor of more active torrents. When the torrent is added,
+ // the user may choose to initialize this to 1, in which case
+ // it will never be unloaded from RAM
+ bool m_pinned:1;
+
+ // when this is false, we should unload the torrent as soon
+ // as the no other async. job needs the torrent loaded
+ bool m_should_be_loaded:1;
+
+// ----
+
+ // the timestamp of the last piece passed for this torrent
+ // specified in session_time
+ boost::uint16_t m_last_download;
+
+
+ // this is a second count-down to when we should tick the
+ // storage for this torrent. Ticking the storage is used
+ // to periodically flush the partfile metadata and possibly
+ // other deferred flushing. Any disk operation starts this
+ // counter (unless it's already counting down). 0 means no
+ // ticking is needed.
+ boost::uint8_t m_storage_tick;
+
+// ----
+
+ // the timestamp of the last byte uploaded from this torrent
+ // specified in session_time
+ boost::uint16_t m_last_upload;
+
+ | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1587 | There are 8 bits here |
There are 8 bits here../include/libtorrent/torrent.hpp:1587
+ // the timestamp of the last piece passed for this torrent
+ // specified in session_time
+ boost::uint16_t m_last_download;
+
+
+ // this is a second count-down to when we should tick the
+ // storage for this torrent. Ticking the storage is used
+ // to periodically flush the partfile metadata and possibly
+ // other deferred flushing. Any disk operation starts this
+ // counter (unless it's already counting down). 0 means no
+ // ticking is needed.
+ boost::uint8_t m_storage_tick;
+
+// ----
+
+ // the timestamp of the last byte uploaded from this torrent
+ // specified in session_time
+ boost::uint16_t m_last_upload;
+
+
+ // if this is true, libtorrent may pause and resume
+ // this torrent depending on queuing rules. Torrents
+ // started with auto_managed flag set may be added in
+ // a paused state in case there are no available
+ // slots.
+ bool m_auto_managed:1;
+
+ enum { no_gauge_state = 0xf };
+ // the current stats gauge this torrent counts against
+ boost::uint32_t m_current_gauge_state:4;
+
+ // set to true while moving the storage
+ bool m_moving_storage:1;
+
+ // this is true if this torrent is considered inactive from the
+ // queuing mechanism's point of view. If a torrent doesn't transfer
+ // at high enough rates, it's inactive.
+ bool m_inactive:1;
+
+ | ||
relevance 0 | ../include/libtorrent/torrent.hpp:1608 | there's space for 1 bits here |
there's space for 1 bits here../include/libtorrent/torrent.hpp:1608
// if this is true, libtorrent may pause and resume
// this torrent depending on queuing rules. Torrents
// started with auto_managed flag set may be added in
@@ -6213,9 +6390,10 @@ namespace libtorrent
// is optional and may be 0xffffff
unsigned int m_downloaded:24;
- // the number of seconds since the last scrape request to
+ // the timestamp of the last scrape request to
// one of the trackers in this torrent
- boost::uint64_t m_last_scrape:16;
+ // specified in session_time
+ boost::uint16_t m_last_scrape;
// ----
@@ -6236,8 +6414,7 @@ namespace libtorrent
#if TORRENT_USE_ASSERTS
public:
- // set to false until we've loaded resume data
- | ||
relevance 0 | ../include/libtorrent/torrent_info.hpp:124 | include the number of peers received from this tracker, at last announce |
include the number of peers received from this tracker, at last announce../include/libtorrent/torrent_info.hpp:124
+ | ||
relevance 0 | ../include/libtorrent/torrent_info.hpp:124 | include the number of peers received from this tracker, at last announce |
include the number of peers received from this tracker, at last announce../include/libtorrent/torrent_info.hpp:124
// if this tracker failed the last time it was contacted
// this error code specifies what error occurred
error_code last_error;
@@ -6288,7 +6465,7 @@ namespace libtorrent
// flags for the source bitmask, each indicating where
// we heard about this tracker
enum tracker_source
- | ||
relevance 0 | ../include/libtorrent/upnp.hpp:113 | support using the windows API for UPnP operations as well |
support using the windows API for UPnP operations as well../include/libtorrent/upnp.hpp:113 // specific port
+ | ||
relevance 0 | ../include/libtorrent/upnp.hpp:113 | support using the windows API for UPnP operations as well |
support using the windows API for UPnP operations as well../include/libtorrent/upnp.hpp:113 // specific port
external_port_must_be_wildcard = 727
};
@@ -6339,7 +6516,7 @@ public:
// is -1, which means failure. There will not be any error alert notification for
// mappings that fail with a -1 return value.
int add_mapping(protocol_type p, int external_port, int local_port);
- | ||
relevance 0 | ../include/libtorrent/utp_stream.hpp:391 | implement blocking write. Low priority since it's not used (yet) |
implement blocking write. Low priority since it's not used (yet)../include/libtorrent/utp_stream.hpp:391 for (typename Mutable_Buffers::const_iterator i = buffers.begin()
+ | ||
relevance 0 | ../include/libtorrent/utp_stream.hpp:391 | implement blocking write. Low priority since it's not used (yet) |
implement blocking write. Low priority since it's not used (yet)../include/libtorrent/utp_stream.hpp:391 for (typename Mutable_Buffers::const_iterator i = buffers.begin()
, end(buffers.end()); i != end; ++i)
{
using asio::buffer_cast;
@@ -6390,7 +6567,7 @@ public:
if (m_impl == 0)
{
m_io_service.post(boost::bind<void>(handler, asio::error::not_connected, 0));
- | ||
relevance 0 | ../include/libtorrent/kademlia/item.hpp:61 | since this is a public function, it should probably be moved out of this header and into one with other public functions. |
since this is a public function, it should probably be moved
+ | ||
relevance 0 | ../include/libtorrent/kademlia/item.hpp:61 | since this is a public function, it should probably be moved out of this header and into one with other public functions. |
since this is a public function, it should probably be moved
out of this header and into one with other public functions.../include/libtorrent/kademlia/item.hpp:61#include <boost/array.hpp>
namespace libtorrent { namespace dht
@@ -6426,11 +6603,6 @@ void TORRENT_EXPORT sign_mutable_item(
, char const* sk
, char* sig);
-sha1_hash TORRENT_EXTRA_EXPORT mutable_item_cas(
- std::pair<char const*, int> v
- , std::pair<char const*, int> salt
- , boost::uint64_t seq);
-
enum
{
item_pk_len = 32,
@@ -6442,7 +6614,12 @@ class TORRENT_EXTRA_EXPORT item
{
public:
item() : m_seq(0), m_mutable(false) {}
- | ||
relevance 0 | ../include/libtorrent/aux_/session_impl.hpp:412 | move the login info into the tracker_request object |
move the login info into the tracker_request object../include/libtorrent/aux_/session_impl.hpp:412
+ item(char const* pk, std::string const& salt);
+ item(entry const& v) { assign(v); }
+ item(entry const& v
+ , std::pair<char const*, int> salt
+ , boost::uint64_t seq, char const* pk, char const* sk);
+ | ||
relevance 0 | ../include/libtorrent/aux_/session_impl.hpp:412 | move the login info into the tracker_request object |
move the login info into the tracker_request object../include/libtorrent/aux_/session_impl.hpp:412
void on_lsd_announce(error_code const& e);
// called when a port mapping is successful, or a router returns
@@ -6493,7 +6670,7 @@ public:
#ifndef TORRENT_DISABLE_EXTENSIONS
void add_extensions_to_torrent(
- | ||
relevance 0 | ../include/libtorrent/aux_/session_impl.hpp:900 | should this be renamed m_outgoing_interfaces? |
should this be renamed m_outgoing_interfaces?../include/libtorrent/aux_/session_impl.hpp:900 // listen socket. For each retry the port number
+ | ||
relevance 0 | ../include/libtorrent/aux_/session_impl.hpp:900 | should this be renamed m_outgoing_interfaces? |
should this be renamed m_outgoing_interfaces?../include/libtorrent/aux_/session_impl.hpp:900 // listen socket. For each retry the port number
// is incremented by one
int m_listen_port_retries;
@@ -6544,7 +6721,7 @@ public:
mutable boost::uint8_t m_interface_index;
void open_new_incoming_socks_connection();
- | ||
relevance 0 | ../include/libtorrent/aux_/session_interface.hpp:200 | it would be nice to not have this be part of session_interface |
it would be nice to not have this be part of session_interface../include/libtorrent/aux_/session_interface.hpp:200 virtual boost::uint16_t listen_port() const = 0;
+ | ||
relevance 0 | ../include/libtorrent/aux_/session_interface.hpp:200 | it would be nice to not have this be part of session_interface |
it would be nice to not have this be part of session_interface../include/libtorrent/aux_/session_interface.hpp:200 virtual boost::uint16_t listen_port() const = 0;
virtual boost::uint16_t ssl_listen_port() const = 0;
// used to (potentially) issue socket write calls onto multiple threads
diff --git a/docs/utp_stack.diagram b/docs/utp_stack.diagram
new file mode 100644
index 000000000..2de786b8f
--- /dev/null
+++ b/docs/utp_stack.diagram
@@ -0,0 +1,9 @@
++-----------------------+
+| BitTorrent protocol |
++-----------------------+
+| SSL |
++-----------+-----------+
+| TCP | uTP |
+| +-----------+
+| | UDP |
++-----------+-----------+
diff --git a/docs/write_disk_buffers.diagram b/docs/write_disk_buffers.diagram
new file mode 100644
index 000000000..4f2326ef8
--- /dev/null
+++ b/docs/write_disk_buffers.diagram
@@ -0,0 +1,15 @@
+
+ decrypt in place move buffer ref.
++----------------+ (no copy) +------------+ (no copy) +------------+
+| receive buffer +--=-------------->| plain text +--=--------------->| disk cache |
++----------------+ | buffer | +------+-----+
+ ^ +------------+ |
+ | read() on socket write() to file |
+ | (copy) (copy) |
+---=----|---------------------------------=---------------------------------|--=----
+ | kernel space |
+ | v
++-------+--------+ +-------------------+
+| socket kernel | | kernel page cache |
+| buffer | | |
++----------------+ +-------------------+
diff --git a/docs/write_disk_buffers.dot b/docs/write_disk_buffers.dot
deleted file mode 100644
index 1fc257533..000000000
--- a/docs/write_disk_buffers.dot
+++ /dev/null
@@ -1,20 +0,0 @@
-digraph downloading {
- label=""
- node [shape=box];
-
- subgraph user_space {
- rank=same;
- "receive buffer" -> "plain text buffer" [label="decrypt in-place (no copy)" style=dashed];
- "plain text buffer" -> "disk cache" [label="move buffer reference (no copy)" style=dashed]
- }
-
- subgraph kernel {
- rank=same;
- "socket kernel buffer";
- "kernel page cache"
- }
-
- "socket kernel buffer" -> "receive buffer" [label="read() on socket (copy)"];
- "disk cache" -> "kernel page cache" [label="write() to file (copy)"]
-}
-
diff --git a/docs/write_disk_buffers.png b/docs/write_disk_buffers.png
index d8790c859..730dd7274 100644
Binary files a/docs/write_disk_buffers.png and b/docs/write_disk_buffers.png differ
diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp
index 2dedda1c3..5dc4c9e26 100644
--- a/include/libtorrent/torrent.hpp
+++ b/include/libtorrent/torrent.hpp
@@ -1568,7 +1568,7 @@ namespace libtorrent
// specified in session_time
boost::uint16_t m_last_download;
- // TODO: 8 bits free here
+ // TODO: There are 8 bits free here
// this is a second count-down to when we should tick the
// storage for this torrent. Ticking the storage is used
@@ -1584,7 +1584,7 @@ namespace libtorrent
// specified in session_time
boost::uint16_t m_last_upload;
- // TODO: 8 bits here
+ // TODO: There are 8 bits here
// if this is true, libtorrent may pause and resume
// this torrent depending on queuing rules. Torrents
| ||