From 6a4b8e7daea689447a924fd0a98f5f95681ca017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E7=A0=81=E7=AC=94=E8=AE=B0?= <63114411+yuanmabiji@users.noreply.github.com> Date: Sat, 3 Jul 2021 10:15:53 +0800 Subject: [PATCH 1/9] Update README.md --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index 8bb8902..a2e06d2 100644 --- a/README.md +++ b/README.md @@ -59,19 +59,3 @@ * Zookeeper * ..... --------------------------------------------- -微信搜: - -**公众号:源码笔记** - -![img](https://common-ymbj.oss-cn-beijing.aliyuncs.com/%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.PNG) - -**联系我:hardwork-persistence** - -###### - - - - - -![img](https://common-ymbj.oss-cn-beijing.aliyuncs.com/%E7%88%B1%E7%BC%96%E7%A0%81%E7%9A%84%E7%A0%81%E5%86%9C%E4%BA%8C%E7%BB%B4%E7%A0%81.PNG) From 6ebbc0a2ca2a28c75be9f6d0dd4ebae99561411c Mon Sep 17 00:00:00 2001 From: yuanmabiji <13570990660@163.com> Date: 2022年3月25日 18:23:02 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E5=88=9D?= =?UTF-8?q?=E8=AF=86Disruptor=E6=A1=86=E6=9E=B6=E3=80=8B=E4=B8=80=E6=96=87?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Disruptor/README.md | 16 ++ ...7206円Disruptor346円241円206円346円236円266円.md" | 147 ++++++++++++++++++ README.md | 6 + 3 files changed, 169 insertions(+) create mode 100644 Disruptor/README.md create mode 100644 "Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" diff --git a/Disruptor/README.md b/Disruptor/README.md new file mode 100644 index 0000000..2ed479a --- /dev/null +++ b/Disruptor/README.md @@ -0,0 +1,16 @@ + +【**源码笔记**】专注于Java后端系列框架的源码分析。若觉得源码分析文章不错,欢迎Star哦。 + + +================**Disruptor源码专题持续更新中...**==================== + +#### 目录 + +1. [初识Disruptor框架!](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/初识Disruptor框架.md) +2. 持续更新中... + +* 更多源码分析文章请跳转至:https://github.com/yuanmabiji/Java-SourceCode-Blogs + + + + diff --git "a/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" "b/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" new file mode 100644 index 0000000..b6d137a --- /dev/null +++ "b/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" @@ -0,0 +1,147 @@ +>最近工作中参与了一个随机数分发平台的设计,考虑如何才能实现该平台的高并发性能,在技术实现选型中首先参考了百度的[uid-generator](https://github.com/baidu/uid-generator),其采用了双`RingBuffer`的实现形式,估计uid-generator的双`RingBuffer`也是借鉴了Disruptor的实现思想吧。因此,本系列文章我们一起来探究学习下2011年获得了Duke’s 程序框架创新奖的`Disruptor`框架。 + + +# 1 前言 +Martin Fowler在自己网站上写了一篇LMAX架构的文章,LMAX是一种运行在JVM平台上的新型零售金融交易平台,该平台能够以很低的延迟产生大量交易,大量交易是多少呢?单个线程达到了每秒处理6百万订单的TPS,虽然业务逻辑是纯内存操作,但每秒处理6百万订单的TPS已经高的惊人了。那么,是什么支撑了LMAX单个线程能达到每秒处理6百万订单呢?答案就是`Disruptor`。 + +`Disruptor`是一个开源的并发框架,其于2011年获得了Duke’s 程序框架创新奖,采用事件源驱动方式,能够在无锁的情况下实现网络的Queue并发操作。 + +# 2 Disruptor框架简介 + +`Disruptor`框架内部核心的数据结构是`Ring Buffer`,`Ring Buffer`是一个环形的数组,`Disruptor`框架以`Ring Buffer`为核心实现了异步事件处理的高性能架构;JDK的`BlockingQueue`相信大家都用过,其是一个阻塞队列,内部通过锁机制实现生产者和消费者之间线程的同步。跟`BlockingQueue`一样,`Disruptor`框架也是围绕`Ring Buffer`实现生产者和消费者之间数据的交换,只不过`Disruptor`框架性能更高,笔者曾经在同样的环境下拿`Disruptor`框架跟`ArrayBlockingQueue`做过性能测试,`Disruptor`框架处理数据的性能比`ArrayBlockingQueue`的快几倍。 + +`Disruptor`框架性能为什么会更好呢?其有以下特点: + +1. 预加载内存可以理解为使用了内存池; +2. 无锁化 +3. 单线程写 +4. 消除伪共享 +5. 使用内存屏障 +6. 序号栅栏机制 + +# 3 相关概念 + +![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/42a0a0b512744b1fadf0a05bae213a84~tplv-k3u1fbpfcp-watermark.image?) + + +**Disruptor**:是使用`Disruptor`框架的核心类,持有`RingBuffer`、消费者线程池、消费者集合`ConsumerRepository`和消费者异常处理器`ExceptionHandler`等引用; + +**Ring Buffer**: `RingBuffer`处于`Disruptor`框架的中心位置,其是一个环形数组,环形数组的对象采用预加载机制创建且能重用,是生产者和消费者之间交换数据的桥梁,其持有`Sequencer`的引用; + + +**Sequencer**: `Sequencer`是`Disruptor`框架的核心,实现了所有并发算法,用于生产者和消费者之间快速、正确地传递数据,其有两个实现类`SingleProducerSequencer`和`MultiProducerSequencer`。 + +**Sequence**:`Sequence`被用来标识`Ring Buffer`和消费者`Event Processor`的处理进度,每个消费者`Event Processor`和`Ring Buffer`本身都分别维护了一个`Sequence`,支持并发操作和顺序写,其也通过填充缓存行的方式来消除伪共享从而提高性能。 + +**Sequence Barrier**:`Sequence Barrier`即为序号屏障,通过追踪生产者的`cursorSequence`和每个消费者(` EventProcessor`)的`sequence`的方式来协调生产者和消费者之间的数据交换进度,其实现类`ProcessingSequenceBarrier`持有的`WaitStrategy`等待策略类是实现序号屏障的核心。 + +**Wait Strategy**:`Wait Strategy`是决定消费者如何等待生产者的策略方式,当消费者消费速度过快时,此时是不是要让消费者等待下,此时消费者等待是通过锁的方式实现还是无锁的方式实现呢? + +**Event Processor**:`Event Processor`可以理解为消费者线程,该线程会一直从`Ring Buffer`获取数据来消费数据,其有两个核心实现类:`BatchEventProcessor`和`WorkProcessor`。 + +**Event Handler**:`Event Handler`可以理解为消费者实现业务逻辑的`Handler`,被`BatchEventProcessor`类引用,在`BatchEventProcessor`线程的死循环中不断从`Ring Buffer`获取数据供`Event Handler`消费。 + +**Producer**:生产者,一般用`RingBuffer.publishEvent`来生产数据。 + + + + + +# 4 入门DEMO +```java +// LongEvent.java +public class LongEvent +{ + private long value; + + public void set(long value) + { + this.value = value; + } + + public long get() { + return this.value; + } +} +``` + +```java +// LongEventFactory.java +public class LongEventFactory implements EventFactory +{ + @Override + public LongEvent newInstance() + { + return new LongEvent(); + } +} +``` + +```java +// LongEventHandler.java +public class LongEventHandler implements EventHandler +{ + @Override + public void onEvent(LongEvent event, long sequence, boolean endOfBatch) + { + System.out.println(new Date() + ":Event-" + event.get()); + } +} +``` + +```java +// LongEventTranslatorOneArg.java +public class LongEventTranslatorOneArg implements EventTranslatorOneArg { + @Override + public void translateTo(LongEvent event, long sequence, ByteBuffer buffer) { + event.set(buffer.getLong(0)); + } +} +``` + +```java +// LongEventMain.java +public class LongEventMain +{ + public static void main(String[] args) throws Exception + { + int bufferSize = 1024; + final Disruptor disruptor = new Disruptor( + new LongEventFactory(), + bufferSize, + Executors.newSingleThreadExecutor(), + ProducerType.SINGLE, + new YieldingWaitStrategy() + ); + + disruptor.handleEventsWith(new LongEventHandler()); + disruptor.start(); + + + RingBuffer ringBuffer = disruptor.getRingBuffer(); + ByteBuffer bb = ByteBuffer.allocate(8); + for (long l = 0; true; l++) + { + bb.putLong(0, l); + ringBuffer.publishEvent(new LongEventTranslatorOneArg(), bb); + Thread.sleep(1000); + } + } +} +``` +输出结果: + + +![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/599d44256be84bfea44f5c9dc36a4f33~tplv-k3u1fbpfcp-watermark.image?) + + +参考:https://lmax-exchange.github.io/disruptor/user-guide/index.html + + + +**若您觉得不错,请无情的转发和点赞吧!** + +【源码笔记】Github地址: + +https://github.com/yuanmabiji/Java-SourceCode-Blogs + diff --git a/README.md b/README.md index a2e06d2..f5eb0a3 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ * JDK源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/JDK * JDK源码解析项目(带中文注释):https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs +================**Disruptor源码专题持续更新中...**==================== +1. [Java是如何实现自己的SPI机制的? JDK源码(一)](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/JDK/1%20Java%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%B7%B1%E7%9A%84SPI%E6%9C%BA%E5%88%B6%E7%9A%84%EF%BC%9F%20JDK%E6%BA%90%E7%A0%81%EF%BC%88%E4%B8%80%EF%BC%89.md) +2. 持续更新中... +* JDK源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/JDK +* JDK源码解析项目(带中文注释):https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs + ================**TODO LIST**==================== * SpringMVC From c3911066466ac7bcabaabbf20b30953371023bfe Mon Sep 17 00:00:00 2001 From: yuanmabiji <13570990660@163.com> Date: 2022年3月25日 18:26:18 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E5=88=9D?= =?UTF-8?q?=E8=AF=86Disruptor=E6=A1=86=E6=9E=B6=E3=80=8B=E4=B8=80=E6=96=87?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Disruptor/README.md | 1 + README.md | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Disruptor/README.md b/Disruptor/README.md index 2ed479a..f15d526 100644 --- a/Disruptor/README.md +++ b/Disruptor/README.md @@ -9,6 +9,7 @@ 1. [初识Disruptor框架!](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/初识Disruptor框架.md) 2. 持续更新中... +* Disruptor源码解析项目(带中文注释):https://github.com/yuanmabiji/disruptor * 更多源码分析文章请跳转至:https://github.com/yuanmabiji/Java-SourceCode-Blogs diff --git a/README.md b/README.md index f5eb0a3..d21d43d 100644 --- a/README.md +++ b/README.md @@ -45,10 +45,10 @@ * JDK源码解析项目(带中文注释):https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs ================**Disruptor源码专题持续更新中...**==================== -1. [Java是如何实现自己的SPI机制的? JDK源码(一)](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/JDK/1%20Java%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%B7%B1%E7%9A%84SPI%E6%9C%BA%E5%88%B6%E7%9A%84%EF%BC%9F%20JDK%E6%BA%90%E7%A0%81%EF%BC%88%E4%B8%80%EF%BC%89.md) +1. [初识Disruptor框架!](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/初识Disruptor框架.md) 2. 持续更新中... -* JDK源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/JDK -* JDK源码解析项目(带中文注释):https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs +* Disruptor源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/Disruptor +* Disruptor源码解析项目(带中文注释):https://github.com/yuanmabiji/disruptor ================**TODO LIST**==================== From 4c3a06f0745aafb7ebb237ed6a686743620372e2 Mon Sep 17 00:00:00 2001 From: yuanmabiji <13570990660@163.com> Date: 2022年3月25日 18:39:24 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E5=88=9D?= =?UTF-8?q?=E8=AF=86Disruptor=E6=A1=86=E6=9E=B6=E3=80=8B=E4=B8=80=E6=96=87?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Disruptor/README.md | 1 + Disruptor/images/img.png | Bin 0 -> 89624 bytes Disruptor/images/img_1.png | Bin 0 -> 13594 bytes ...257206円Disruptor346円241円206円346円236円266円.md" | 6 ++---- 4 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 Disruptor/images/img.png create mode 100644 Disruptor/images/img_1.png diff --git a/Disruptor/README.md b/Disruptor/README.md index f15d526..b276848 100644 --- a/Disruptor/README.md +++ b/Disruptor/README.md @@ -15,3 +15,4 @@ + diff --git a/Disruptor/images/img.png b/Disruptor/images/img.png new file mode 100644 index 0000000000000000000000000000000000000000..3f07d956303d3e111cc428c5bc4b24c2d690c4f5 GIT binary patch literal 89624 zcmd3NWm{a)vUGw=u;4IQa0vu=2=4Cg?(P=c-7UDg1Shz=ySux?yK~OH_cy$s80OhC zd)C^$x~rZebi`C!0+cSx9pg+6`q{Uj#Hr|7DE z+74|CT1aHJ99frLZ|JOQ1kJCn)ta|&-JDn5afm9{lgOiWWuX4t1&IlQ368TLWHA2p z9R&V3K*9Wi`JziEbjZ7AQ#f^q?MnzLPB>L$-R|zS;r2)8!Lf73#kl3g<73pp8vr4v z^;Fk0`ed`~KmRy??Ra4R_vYnhP0wF=qW`>HoZ1YG`R}Esm;8hOy^zV3X!k##;lyb} zzW(>|XgmaM7`IE{%*tb~? z!)cfuWOA|scTmyR_CA^aZi&)pu|gL3KdX2CJl!P{jlb6HU}9}uSyLk?qw{dyo{mJY zhQ55Q-ue>qNWchj#e}j#;y0H6rmx&fslxt1u*z<0>!Yo`es{8voSaO+>)mD*&;LI^ zUBg!l8WR(9U|>K(LV`|nvct*b{QOO5IZ1XMRe8Rqp!FeZqWMoK88ドル$}b4amA?OtLm1?4a+1ドルEV3o$kg>`j| z%*;w!0(<@4i_;a9!`4-ln5i5q^y+rth4j% z8m$<&a~2yu;9ts?{d&a&k^e=-*)60p_mbm89jzqv*l%cb3mc$@mck^ilq=m<4@n2kiq4>~CK!&5ap7ZcUCZ0sJ2EnIXJ==T7G~?7tIdsQ z_p0<0iteqz9ssel*iqftk|n%60r~~+g|zyk8y#iryon~qufi8rlr+0octib!;gig} z(NgHqed@_t!r0VasZ$rDSG&ixx`~5^nKj?^Tt?ILe)mx7IJ0M3UEvOhIw7Vfa>BN0 zl$O>HA4*9Zvr=@?$h^^EVtvBP)ARV`q(%q`+(kP=-WOiaN95-5+1Z5r{M`nNnVTDj zh&A201I&5aFnf&ot?EokFFy$bmt80nqHvw5a70(HC{=1&+S)&V2GGIlV|D{q@rDhc zePOo7(pg1BM2PTFP*B2#r-@OeP#G(5Rh_)Afo|wOKB+y};Y=K571WYbvWkO9%^3`6-8{! zO!LzV8t~_*SLJ?i$&qtlmC`yQO3j|VZ=(W<;8c^#0*fICOw<24r26hdvg0hi7(a)*t%w?vwehcwqm~~tjri17a7l{p@e0zkpzr-(b z+_$i;^&vJDHct2U=2unOI6Gso-!^8_xwgrNz~!`UH?MEicGZ-2*)59(Qc+{eSj&xe zfM*X4XJ2174i1M~p3z<+)w^s1v4&^0?yu(jl@*a8pk@!8$%&=)c{+w&#bwoe7`rt6 zQy8TQZZNlLOOB@{BxSYaiwsSfYET2a9yV;E#6122v539ドルZe*<&q5cnxsw(%2l;bed zq(3o0v^73mOaA)n^jTzB2&%4dnpeH%Bs?0ZnKc46{2vNvsR+|uIXO9{rBo12ドルT9gi zogUF1BWK|$kLk{Rsjh{W`x}v#j2SAr5{XKr?(XhQ`dGNQ8tUrZ%)O0XP|(pT&~iix z3T!LPva_u6)2#AT;}kvr*_^F7{^^mhm8 z&h3)_6f8d6a8da1P8vt;bQRPPbtaFuJwf*{WkySJ(ImHOFMj_r-!wQb)w|~d^uOTF zA>?;`IM>=`uxV5)z7wGr>qIw4saFusaY9)QW?nFQjdAa*4dzWB&#b)B}-&Aq3SE z+GEGSw`jLGK4v>i4d2kvU}0_!1r2R?cljM=ixFcGsbw@0R9yAv9{u^_4Jfy*PABt8 zK0dAd{@m4>P#MgRhd_xD5f(PLu;}UTHr$nNxHEP^*mXhZzMfzFsm+=J?v~YI+=YTT zmYEuPhHb2zW>SDCK7v>0LLVY+3m<9!cdla2o*fv4y;iu=488ドルkzb=_hwu`s7rhzg8 z`YND3{{7?i;^PLk9)kT_KPCH`h=>Xc^GsDG``K)&S8NS!Db4}hNba%5%vM4Yw>zH< zE!8+PS3f&9_3u31>9#+*YvjPsPbc0i7he9mO{mn(bWM4A#GITjr_Bni82vWu zS<*jdk;`sxhpsarysXK@u@`rCb_N9Wvg0&1He!LNkKXnP&I1KO zRTT>rRY67NPwo363+&g7Hk;2l0B8fZx8$WLv*CnUAs<{b0ppxmbvw^b8a75ba^yil&5foc< z(%PN$ZLSXbSM&LQMc>Fu7^RgncTo0Z3x0%9h*%2Mlb{H)XPhf)8U9VD6f>G5_Ws*f zpavX5(M)>qZ;?S?k*1ドルb`LWnuk}4#3S){H7X@lHe?yX3YC(-kFQv84XiKEl9liNNx zfJP7)|LiR$CMGL8Sz|Czt?lCS(A31{*jwZrE$rsj?C&q2u8zayf_qu)C|vMMXt5 zGcyw(AAk63kdC`5R*Eo{LOIwM*xab7D4--hKR>&3qGQr(PR`CM%FD+kB=i;xcwi z{vl;{DPnOcX#9=VP&r%LuZq+u0o8v^hB2JwolJF{7hcx=-HQ2^c8J5{FfU8x>+Wu) ziFtv$vU#>nh?;vN>oH-|6PEG*i!nOX@4T#7nl$m!9^&oOaH^hTbyUw^k`krF+X`B= z8pVqoN556vv=Soo#)ZJKX)u(7fE$M(25GT4k$&vexd3IpMu0CM#_gxDyZdu$-GE6Y z(yA&b2cMlUk(f0}*oHY{+4j)X5jkxlhaOb> zjnB&qQOe*CZTq6H%_KNRr348g_ouWvrc_+!m?**`Eql!T6s9)mELl9`zq8ylONiY*A=KKMQmVPIeY&QLF|q0!pdh>>`F zY#x*IOExV(pCtb%D=P~~wJEkaX_b|gs(ALjWhzzt#8X0ATHN&XQ@yWd9I*BEZ@EH{I)gj6)}LObC8a#yv(?O3t4DvYLaH(iDYgg~ z!pmA#9#)va`K}q!mD?OCuG@rt%se*5{5?Ok_IUsB+I>11uCEuZQFzMW_wi=JTp+z( z9}Xi`4DZuz^nasXkDIczxfz?^^?9_W#DaU_0J?Gl3C_}w#W?oLHse%Tu1K}h6uFk- z80~Dtdije^xdS+_+1D#Hv;sb-*l1DC|aL?ZgOsR7#b?6ub*95z%2V&2^%S>Q;x$Q&h?d8PC>y#_=6M+-*mUm$y;jm zlOW{KO;Ajcer|nDqnW9xW{S@5jm_uVy$J7!4F^jF5XuBRJFCsa84ojaMJbWe62w+$ zxpk zc&mP>iK$%;CsG3`Gu!9=Dca|C=g+$P$;-yaJCe_1Pc+Z-;P5b99jvo~f&wbU1?*d` z%{3&Y%fgH=FFE6g?dp@Q7qm!o~IV{ zXEbDF-&dqszuwuUC3YH`FD>v#{8izYbie#L>M>GB!r_QCAc?ll&+#$#F=l2MqY1d( zt{;zf24qt0=d#MxcI`z^pfVbyz5pD>kK08^V=(7fhK#&Oadskc4qA~3Qi%yFr3V$|J2f<4vlxmksf$w^|3i8^ykvk+dffmgh)8zsuba#f2eyydc*&jpv6la1njh2< z2Ce;D{oXD)1tldJDXEya__pHfU6s$asfoes8XM>5<|3n`goqug5(q6oaw#4@f6$qn+QR|%rKmcj6I_k#kvKPqHz@rIc$WTF0|jj>oHncT7E^1zgY9I{dn(z zejwofEv_HU=Iqn(9z(`!=+Om)K#i~&VA4FTt$zjdYv1xaoP{iQV)V*G$#!>@I66P3d~Wy$ z4TAXvVP>Q=xY&NEGjhx|&8G=+CCo7!QBz5@xTdtat5cMT2MRYuOR{{CnMI0RK!{$* zk*1s1i@lbdMV&Y_Bv#773?4AM7Ua&z-6ドルbjf|!ogmxk$)p6$uiZ;#GgJlL^0I5%>- zoXpy-*WJdf3=E54i$H~vHjuzq!(+s1K?i*);d4A;Tj3E-PGy%97l%Xc9v>gKSg7QC z8hrDd#69g#PT?G6jS-9=RA^HPKx+38=LJt%r4hYmEF3?7Kb#^q-q%+ra;mARK^Dpn z8bn)~5QOx5^$rEqmz2QD2UqJ%5%v)NJwBhN%Q`zb0pOR7wYge{gOA(O``W=GcT0o^SdKCfPE~sxy7%E_RzyZf|NUyjX-My^@A$hsG$yLqQaqV4 z#~ecH-S;K3{pD$UawkXh_-QcyZ<+>QJzJo~^LE<4%d=97gh`fo7vx8`x~jrwa6c9o z>VI>4PkAS8*pGTGU!`!8QVW2KbUZtxyubPbIrCSwy_|!YYZ<&{wi@mkglg2oodv{2 zCZsaUGlM<3)ot9phvx+{&ges?b~ep4=2u$wvx`!q`=gu(f?8mmxw>$YTJp8_?-uEm zEgovQLw#%IWmSew@k_YlcG9!jLx?8uTWe>}v^Ji#qO>0F?o`y&0ODtt5)cqDGBVoQ z+A=ma78e%>_|p6PJ0v7zdwaVmbr+Cq@bl4dLPx(s_q&zcczOA|SZ}m?z0iuwH%lcZ z(Bs#jcLQ{D$g*|hQKfa`tE0}yt}R3sf{Gy2DE??#;hbq%xW#q|Zjf$(KR9u1m`EjB znlW0sNw>IcTCBTpjT)IzFH+H88BQ}FShfh1UomvQVYiWadvbPuR9HOAqf^nCky7VA zN>Vfa;AInog7I0C%u0oV;wY!G_ZQdyp1* z!41Q}98>;U+bFfg%&Y%tj-=fX50r4JbS2q)*FEMP8lyu`bY_h0-4Dh;Et{v#%?;EW zU44s7Z`Vc+R5ドル*Kv!lP^-NT4bXw^CFms_sI%-%2BKVDKG=$xd?G(>tXO<5j-gefw* z{DYmz3tm3K$O%iOGah+(`##H3t?IQM;68Nx3~~(3HmgvNh18cuB9DS0u2Nuhe0-7H)$j ztlv>R%w*2X|2FV8<^rulm6er=dd81+zftcq;21`B3XcETj9e3A;sTS2c*J>772B3F62^LVf1 z4DVv2OVe&#NlO`Yg3L(QQgIFU$guRn{M4q*MTf)dY)ANW7`gOWU46Uj)K8S07U*#L zqD4;ZVaiPLR-D=O^lY844o9`m+3PRa@a}L7*W_r46Rs~BnQZNJT+5^st9%L~{e3$O zY>kM|94&Aj_ukuQHfFl{+lTHY1=ItRs&i9&@(;SPY5PwBXxZ^a583Q4Fn0HNkFT|X z7`w%3d{qv1sD`rSoHj;QjLDVcp}xABpGjaVJ`r!1Izv%MIJ}dWbyR`~E14 zTL%QR2S!t8fYW+(bkszWmX)Qgt!;dMxnvES(rAVU?F*S8^x_f-RnII)4MMp!Motpy6ドルeT4k0BHeQ zTjX;f=0IOK=H1<$l#~=62owwfn4hnxtq@ycyi%^c2h-snbmfunpn`c*kb<9g&<@)l z$!8$!`^Lwjx<0rzteqnjzwal}%lkds=g1+7m0ss(>i;gbAMRP09of(ncxkiwy;n)M z9y~L&cDaiUE1{7|ckjKsY5pl*fn#giti05YmSsrm<7>cVQ6AmPWz8B^)S!__2DN ztayNw!Ejd_XP?IV8nPk4(Lc+A^9E-xvd3t?p| zCbl5^ncC`n_(x0m_MXlBdV1g%X}+8KqG?%ic7xM&q7oYhvT1L1O}3llkbET6%-gbIy&n4xvO_Ka+m%i z*LTS1-8~|mrpJ;++0zpEvm*(hyo?HN?4zX)+ALw~_5K>M%7*V^V_HXYu+mYL?m1J= z%wuAgy+uuK&sss3zRIfjTLk*pSjLGd=W?p}QRt9?8Y``b{Y5Q#SxU%?b1A+`c@4R= zjl~QMgtH8Uqi~~1=hU!f_=uJ6T_`MxcXp&oa(pN(9elp+x4SL9cIpvyAv7~J;52zbww=sLE4k5hJ~MD>*&bt zc{mtLJP?h~?R`9(`o4~G-eP=6yXqvTtR%OvJguapcCouTy*}??TB#K_PPK$?4w zc-h!O9FenM@pB70mp;vl`c;#GHxoS%yo}1hC&$XVb|fiG z6ドルGFLPk9B#T|;#9QXFK|wT~U%_qwKHdqdOGiU#P>uJ@Xu(35uVo-?a?|CD*7+Ic#i{v~HTF-u{Q?NyJ(23ITWD&V zZnVL3Ow4XQeSH90WBl>s2R%K?w3591FMr#GN-f^UE~Ji+w~LQsl}>vX7dl$n%HrbU zRi@IivXhgOD-;(eCj=y<9og)g8?tfw&*y(42;u}*9!|jjrodjb)gw9gcxr3_{>CKA z1kE)5Fr};Y1(ityt!F9S9?9J(*u|>+M@u8n1MS`wB-3J>g0L%&v#+GB6@b+^qTPm; zM2LW0`3V+BrWXi-vY4g^L-TE2S&tlUt0rlmcJu{+({>nr973>V<5wqt;x4ac^x$s> zuvaBPQ2mv(S;OMT%1MoZPX7ドル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ドル%l*ZX z+b3A~b`|Y&e+{Fo(r!C6I6XnWdRmJYaMPCWX`~ij<%0d(xf9l%ohdwuun_of=6qv8 z=fAMT$bc18pU~!C;bAJ9G0Wauz1g(ZO2RbjMDz#uEVTibcD?sZ&k~Flk%c%wXGR7R z4hF{7*0u?-b-HIPV74K5Z2ct)R|D7?#*L+v)L6XD9>SC$OiqV`gG0(vSy>t2=NwWK zw5FZ~+%L;llT%Yu3k!gvJ|KyPff2;iUQ=TSV17M4;4nkm zQ@BZ2w&f4aaLWp*t&H^%7%2&@q|O|iS+30}z!~Nzo?2@9e02JNNl6Psp4>Si#l}#xL4ドルw~-9U}`w_Rbgwd^dm|y7F|jL zcHeGvA0SkKb)=%A0$>J!p9e6C075j-@Y^Ne-~=_%5ZYK1yW}S%Cj$xupq%ni;d8s+ zKEn|`b?~8$HpuDd5U{Y&(n|Ah|8zE1vr@tw;ZWOiZ$v37texpzof@2ExDgNi)z%VP zGnT~-4TL83h&mm%I@_{G3DwEti!j>m-1~x0`_2U>WWm)P+{9R^qRLEUl%zj0K93_1 zW?53`^eTh_TSTGRKKBKg6(UM*9(vjpIUUUf%`-fqJss;?FxJ+_Hugg} zUBumSL@gpn+4lCALy~kI?geN^n>BeRZQKIm85}x_vNn4AzJAT@FJ@*qib)MbD2@*I zopI`fUfL+;Ej}Buv-xe?zk;Ysgv=hp+Z*`{0$Vf;C1tOQO{z{8VN(Mme@9!%sD>wf6W5AG>o&C?#j6rrD9q5V<{fxfq!qij9 zKi>=RO#wE-6g`0d&P-1e-mkB(OG`^9B_*YZ0WOxk-CdsNL%P%>Ql&jS8jGUHI*R$B z*=9+biAjIxsG*@!{(@iNJ7<<$q6l_tp+wim3@&?4#vcccivcyk`<0l53tu+8$edq0 zE=xhU#@k3KwN@{aFE>|vQ z_Km(FB(=PnoW%MBc}+>OfFE2WCAszJ7WE7+)3P%PF$xRqy1C`~nP~}~CpYaJ>cSy( z-wQ&b)N!8oNWULOxvSfM&QPUG3A+aN2yh+sgA+;0eAjICqib;hyzFZ8)|Q41ZbYwX z-aewby1KTum$>&x@<1r7>gx0J2Z=#5p8omJsRA6447+-kP2M1U{BwYonwytaRP^QR zbooO13ドルo72ドル?=;6@Dj$_0>Fe0bQ)|KvoVSJ4SDqG^o0Rz6qvS6{1Zc4Ny%w%7@ZAP zfo5?{C7`=M=}*<+!s_!xrn)gry?k(hrgt(uw|#m8v_@jfqr#3nezx-g;&3yo`uzaz zxdLnfAZma}1T7ch9)M09WK`2jwt)~NUiorE57wRhmn?#&<1ドル~z)j_t z2nH6RV>0QZi0>coV&W#s$xkM@6^t%$GEfk*Fj3I6mQhjiupXEjiRme*%X@oEOPR?@ zc#h7kmLCT+S=vO)7OM-Ynw#6}395?gS$oNOgZBoe_P>3fr&UAdNXd6|(Uzu@H`qZ3qyi(DU-@4h&Dxl0G>cHjMCfP9mj#Ywg>Q20!``;Jfu^I z{V}U1<)5^o_%}$yzs+*@9ewws^|v#bw?{|6vb|=$+n_u`i~y49&&9?@7mqkxuo^zq z8yk~(?5pQ=mi0mhK%iktVtwMl3jh=?Q%lS8%1T;F%Auhlzh8g_2gqwgus_9v#ZZ@l z_PFtXOTy`?BtA<*m#dl=h#c@i#n4rjzt)@e8xf0tih7bkrijhliriga-(#{57q^k* zB;bkU5J&^Z6x)lN**a@tXr{Baf00pqGgD{&oO&)zmy21CAW4RpQA~`MrfdcYqm4vH ztsYK@!yWOB2-~aVt~R&A8D+l9?|SO95L<5gt5n63=*g5catoskfu?4iihrrh6x-~CTk7Y!M@=CTFR^>yC5&doaVAY^efu^5Ev!aCySd>C z!c6yhJFFO!Va5#cM#ltDQc!4idS`Ndkx^0kXFmS%;}Ym9ARr*n)6-9q_X+j*lZ)lx@qPg|Af#nUAX`1N zK(~Ds`O-Y~Gy1t|9v&8Gf?xRyz>B~ju8m#(;RTW=qhBa2DuQu+^2@V+;CmG%SvjD3 z08bH^ZIMj-m*ME`mUXj)pnUT`!y**w{#f9|4#Dsy^%Ow$g>@Wj9dYJjv5ドルXM)Q%B? zil}R702=8CYJ>se{QO|qcg+q5F)+Z%+%_mJF8U$o(ZyKhVg?7MTLdGCy|ZgdhDQnwseA&=i!JL6hqsgg9)MvGzIfTBTCU0I2EwDykzo&k{Ro28Er@2lv5SU}Ygol3S<$+#7i%n|fo z>;VD_kz~lw&_t!qg1sPDZX;<12!p)hz-r`dz6zrz)0rawxj0_hl{r=%fq3~|q;ju! zbQq(1>_Y-RSlq*-6>y}YT`iGy^epag23{gSM9E2J0>x@@uE`1)3@>-E*MRzmJqs8`hNzlJh@N?crSRTa`)IZy|b z;1yB7hD0DQoT~QXZ1GWjWPZ#<69>GIAPS2Z?ijv;X1zj*`{|XhOk4-@UK4G$xUA@;|x^;Q^e}p8sKfzR)py+>{J1yj)l3o zwMQS-DoEfdgMUT=8fP~T4?Z~;LMn$1ドル=ZEEA|gcqxx6WY;NX9XvC?gvo1gaveEdYY zfNkxdAqIt)Y|j6E3+|sO;l~eI8JP=UlJKJK2Js$?fgMN@IyxJGZx^UCaTnzDoj+M( zRt+9_v^?M$cTwdZwt@-%0kg}k9stjUT%NaHoG&-P4+o10ドルYz)I-q-g~Lsr&z=d%iX z`IHy5E<6#ggeecmedlkwlvhnq^wd;}<@2>k>yOJDKuJnd-Ymhm4w3N<6t(iwb8vnv zLfg+_J206icB=krJ!(6<&+h(+%rz1ww1(mcy<+m+c@bgqbfz(jkuggmj@6!dec*`p zkqOX+Y*V#4)c3efT9YF_I+|s^=(BY`t2!-99wIE2+THpgmtLkJwrc{pbQeo#+tgjx&nHY zps?`%-k#TijvhBUPgr|J1%g;bM14j{%}!!MSj6nGjehDke7Th`2hEMCgd1cB=~&LK ztqzAd0wT7a+bs|Wl>3pG==`8upnKOt6e+gTFb@p-Z7^+4g7EMF>%rOK;bvn65~vrj z9N^&Kq;Pa@eQxLfAP0l}W=P1!hD8p`^t-c@KyM=-6bpkcc2{jSNi+&6+D-Ve7zwD3 z0Hqnc1lmt^wY9*B$Z<=tu$_{6w-i~cxtzpkdc>FMJ3o&a{Yps&`>iw+(5UH(rGZMO zJZAkY?OQ>n1G%#q5Tny!>3&~tDJUweF0bZp|CG23mvE#gMs>=uqxX6$Ur$^#(r+ht zk`X0|S~qxKC4!6_skLRh7=F5W;(4-nftEE zBTUS0=iRkmSZbr`p<49pibefd_cxr~k>D+J{e0PJUP9V~I%~9UBAE6|oo)hZCctz1tGx z0vkMoQGMfG)j;|Hab(+Mz5 z7_b6!#E-jIH%Z3lIetfWa!;@|LZQ9-ro`xlyI5PcDY+oIeLyWf|0i-46vq1WNI+ zW^|o4vYfP}oTnmRwNGhc^FgSA{L2GgbzPl|m{=FIUo<$uu)ob^vcc~ku7dja(-^_v zRi-ayH!F0CQEhGQk7hz^iU)uPcojH5JwTA83*A zbe^{W@pN-@1FVZ|_tF_`SAEu@0?;ye?2bW;dW(E|ZZY>ULQ(Xf+i!bNpd9)PB?js! z-~Mgefu01AffFXDu3tQM|8iHz9!$iVcm!jFljq6Yb#LmG2}jpHyQevpC$CD^rQR2T&)F z+JMw9EhEFoif5Dkxl>p*$A`E7voAziTQ+<$t31(>D4CuUR#l~*2_wy}fAsQxT^1_uJBOs5k|Fxr` zqeZYkX=rn%MN|7!dt|5mt<#z(4@g z|3n0gic*r2v|25Oy#^9~T48wMyDPwoR#wuvJQ{(3X>G-=gLpz(kSOy1@&oee@$skr zpBq+geL$N|2L}ZL4FiBlBIN{jzTZ^=GqekwwObQoV{gGekIH3xH6-@UEe;vb3~xA!sj}l?KdXQ2fVU!sUb}d|JmH3#+@6sFy)zwERlwBf zi=nKf1Q6oQZQ^g=zEMyN0#g|Alw=lk_!3TuibdCnpEU{yj1;gTVJpVJWFIn~!@N zqJV4ドルjdiz!%#IEo+KZKLxHpB>49ドルnZSqTYh5)ufN5?roMM|eN6CtzMX1+m&3930$` z1W;c9z_W5(w#lpwOu)A!Gn(dwL7~%_a#NT4xGrsY}Gy(GXxT z8Q%HkDk>@-9-M+Tp##c!z+?_NnloM0O;;D+?lus>0EaVFv@Mf$`bW1`)+8x(w_UV0p=g*@z~F(+uTgXMa02;eC0#@cBo(<00@1 z6S1inA2H=cYUg5@GK^Ceu5WIDaYq2>0fA{7>-uzUGz(a4sHvy`w%1FhjnxCpTg%IT z?ccw+h$fsYs^E}QIppmoMClTuugCbBl9m>x_IQNhMb~R^<0|yu5+(qdo}bg5abig~ zn21ドルuGT>&({M&P}X0d&72zYQYKQr!{xV)at@g4k-&`jI~1$+P8%#E``(*>S^{rQPt;@MO9djYe{^d$ZmMr)rIvx7k}^BrF!Y=x=X zBQ^NR>b=bymXL-vaEOtkV=G&(6YrA0sgIBydfzT%;+zSXb6PcR>acIB-fDv*Z)E4- z01ym+7|@J1i)L)fhew6UD;PKj(34ZNcRSk+2S;Yet8|Lx;mkG;IbQxjeX}A5#2Q>O+t&9ibUxlx*u>emJr5 zN*BGvzSALS8S;oy-!?A}f2?fP;qhNn)6fjZAHVhM4b}y+BTIuM1DE`VWY>hGq~}?&f3wSp z*>WGwroCUL(;gWq(UpdFEZbwhh!vyil^#-)Hy9a9~5AKRWyEqWIPL zrT34Im%j-axCur=p^VJTo5!RiB!0CZHDdq**8rs3+t|o8inGUp29!FCDKR;@p8%ja z1=~QtUwrJV2PH8^g!`(Yy5Q@o>^~Qe*v=~n1gf=Y`yJ|s*R#AQCGx4uo zE9h_Hbd-w65ドルjjY-4dQYxr1b(fWUnpNI?O4;pvY}VPs?^Z~?93OpcC9ojw|=EW&`L zR0CY>04BOG{kDjlz~aJV1ksX)mKMGgDfSOY6F)$G03b#K0s>HO(&jg!(I|vhg@K{i zwB553&{AD4L9OtTPn0T>1v%4GQ|F_m&+hjAzW1xbPUy`kXiY=JeUMj!{0Qn; z46L8gHM^Db{v25%W1nUT`#p?R0?Ks;-1aXw5tL8sHD6aB4pc+pI_rVF0JMc%c`A4# zL1`Ho0U;rpgFt6q_ZF@$Df7yFc zo2hTm zK)0_$cw=sJ%7cNS*&*u$+|p!gED7i%K~R#^tngSb}ly5SwXpyP#)%Xq$ZnDMU!9mwPe!z6Y*RMc#n*w^U zwX`%eDe0Y~<1zsp&<~nv%evp8b;y|@05~X9LP9{$e1TpnEz#HqkT5_MsHgxg#{=`uiC_1{ zdIL|`u(_k-*z5ドル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ドル_u(y~y(a5n z$D@f>D}9F8ba_QudCoML6jU4mcJcGOao3|ag4n@8>17=Zj^;bX%W%x&(F(h zYDpL$fP}q@PAJ;*1`oJf7~bWfprZbH)KOI3uY3ej4k+3JeJ>UJ=g1%4P>6Q_oT7=L zoJJ+X4ドルe`obmoS0B)NeYhFZ+*%tpq1rW=)rm8)P+rKgi0fieBKT1nR0`4OhdT>O^O z`R>jiK$e~w3Y7a&oxEtw}=&iowIMS>iSPXl0XCpN5f7$P_(*n}v%{k1E(Tk!e0t z!cDzXPwV5rX+*-|(j3N*;gpq`ITYi1ru)cA7Pa^4F0i|}*c|vevKpNoLc~$vou&$b z3h+8Nr`D)V@T;GT`B69RxRNWa9S3(I<@nkxt3o`+th8?h-y#aa?!xs7sqzb&$-|k; zrUWVE2iWBYpsJMda@ldw)3l~>cI15?ktclqCHb-Mm>X;#t7ND96ek4r4X)4vCKRgBC4^9-`L2ドルH38TCj8AQTkM%kXUizkK*vzbsd48g7=`sKXKo9- zH?dBsok{}LcTC)luyN}nzP{~)gM&9$S3f*D+S*Wc&*IObu=>nH-CTo%yFYxu?rfV} zeRcNs7#>BeC--UbAxVe zi9}0CF8@2~XlNg&KuI)po1SumRO)U$p2bcwf_Wo1A%w&`o4SoV&PkO2dLGy0miW6* z-kOkX--fLmb`5DG;dGIJhJ^#8k!VCieYV@oioQD08ReInVg()M-fwaHl&(7)>_**z z_aHo%f{O(VR#m=IJq-<9q|jkx-yf`35guacaaclp*>Q1lqF`d{Eqz@2_V&A*i#hz6 zSOPxuV>61TRunE3ZD!Uuk=Q7+9CuG9!RUmjuy{oFvGTAZ-bS6%Si2v8Pdyl1miG2& zNH~+$_S@i33?6})?D76yMpial@B&c``Uo#+%ZRZ6I62^no-7a(Yi}3r?iT3o4zu$J zOr-6%_0T18k4rH}S0e0Xmg_`lxH{c&OsK7SjEV%lUSOoa#KMAW7b7Y(#K7sjYcDEV zA0P_B%Ph)IwodV;T@Aph!IbZD{}B&rWL zA+onFs#-OwS3tu#Ui?>gvZLO{)_O@*&C2}J=v}_Pi3t#_9-e_kyBD3~zuc#%kB^O` zBLtU{5{OCP9^cB)3-?eG!CJ%WOAP#)oEz?&^5c)ymb>&efMRfCs&SG_fnk52N6- zl6bQ!9LKd*#t#ssnKSfT^`rMBn)8I|{4O_IAv0TmjX)w6`~eewybcN0$L=$~lkDBz zE(M>VjLd+CesjZZy$cm>SD=DI>{Xjb1WQ4ドル)lpxSgXb9S@948yO!LKE0uOmq`GQx3 z)DS6ot@mC*^4xW7ドル*$+T?vwSd-~v%|0x4C{1QYv}?c$|#@(0lG9viiirFJ>dYT>{=mnj zH637Da*$_dS|*_Q0BZjbh;*(jTqsd+Qm>6TM_|ju`1@`AyaKJABoj_+RpJJg(AJ?t z8+#G~Oiz`Vt2*vJ2JJ$-oAzf%N9clr801)C=bV9UumxSf&Ie`!kN|DYl5Z()kfCFp zlvkHF69unW*>Bm_Rw!%aU9rSjCJo-5&BPhXR{+WybV2+@l)O3SY6up(6myC0czi>o z)10aGHRE@4mYd*+gAlX5Uxrt{_VUCR|6mmGv zE(8O~r<4pbia$m|1ドル-9ドル?g)kqrcun%%refpfgg3h4avw;d(j+ppe6ng6suX?j)z+Rf1;X@8WFH`c#V7>ar40>VBSmee_Qu1;eTs@g z+Gh!9lc16c#UTj7iiQ^_CO&Sc7w+`*L9lg0{0Y_JG#AbFPKA(Bi+@bzR^sQNX>t-c zj)U&h&!i?6kEF0dwIsN?xs3US=}b~=1^y~Yy<=~mfdz=_475mr5^lr%&k+jjeit_j zu!g4F1(A<1l2h7$#c;!*^`dg}=EGjUPF!ISYCWiC!0rT>5Z*7e&g<Q4vtgStUc&0Oce$WP2(~2i&4KwO_rK)gcFm3V57;>+n6=`&w!|4ドルGSe@A?Uw^gHG;P-kbAd zOyYqL9PHR>sj1!dd}EUc(37UW3{B?KUs{7ZZc1 zFG`&~jOeu~#!2$o%EmlPZ-_^gCw-j8SSH?5(~}fWlS(`dnloe@O^nrG&yUf9zL6Zrw|%S5Vhhz9;{HnXkZ;aG zUDiXmV|Ny_;c>>1b+YCQ^zci zq+>ZeuAG>NFSK%_wPswr{-8Q`PDVCP7j}+{wMldfZ~+JN50gbzFKR(d@! zkdY;s><-#v4;~km$nes~gya=q_zy)eeiyiqz=0q_ur)t^9+=|q>TXD0)BHtOK}=jr zOg7QM@mtXo5yrUIpS!qP`le1vO&$M6o72cP+k@NbL0W3EscjRygOlV7cLmv z#Z*yw@0;VS zM@>ijw#G(k927E_74DfSXZC8Cljv*$MA{;HnTBEVbtnp2t2!fNIr_|OaXR}qd^B#s zLjLDORS2mR!kruzDj}Z28$z@V9MvifJ^mkNz%-7_$y0~{j)9|oSZ1omn^zHRSG^>p z=&>5|HypH-=t84M)WZJ~FfoAA3d$eNSsQ0Hxc1W}9IkF|Ru>j<#283v!={!d%>&z= zELtrCa(bY6C;w=!YYTn@)u93P`CTpHyV~7AiR*P+OOF85sVTkLJI{bM*C0(pH=*yH zO`q+3JKH)6;UoJh3xX&1t(4Yqh$dPu6{8t)!iJA(9S;~IJ0mPrEH#~y%evb_=Zz6l zU0XABk$RJ@J-?hhMQXmek=;-)c!;tW4-Z=mn;tCxO+6&aIm5|44d(~3R1I+ou<;z6 z9=?=bn2F2vW`&-(+QF9H@rdVIm+X?w0Mk-^l%`}120NDRS}gzm86u} z8ct3vtw-^dGJTjh(o9V6SAJ2<=1?vdi}3k13nw`yi-hguj7&%>FT2G$K`+D@u}AXq z#5FFPen2ngTGBr$-C9$^@x)Fl02*n9$n>W^Rvqo=uVPEOHvAJj5Qc`6ZiF!9)~i8f zhJ(Y=>8(5-N>`wh+-I2R99$LnmMJbs)Y|f#VP2ドルFt$EG-l)==rwvJZjuW9Xqk9eL3 zXu`I8C0juca^Je2v0N*P%PMS&493Sjy_<-mydba{+^_4aoyjg6yahuxn=q(xi(xr0 z9`bsr_{p1oW6j7USzXjGsru}GcomQ%7&qsYZAY?!rkKTUnt_GkcKW)u!(CetB2d)O z@?-X=j*3)mzA0%Tnd`x&oxni60+WQ7ih!U$vwxI*k9jQ-dw#e@M6c1ZNDTr!pGo(P zO{pqll}Sx?7krED0W%5lT7}C5x%D&a_0I#b(f*HO+<$d3%#=f2fhfg4v$?i*qpkt* z4U|B9AQRvg5K!=Eyfmw;tLyVcq;T0s?yq|chO0VSI?+k>7wa*Ujx7|zzzZ{)RK56Z zi6i<*BtO2JMbkB^Hif0v#Iz1JUqe_7ON) zLO(EdG(9%wEeGsPn7-}ulQoeT9-`&1TOY?iJL2ab)OK4H^y6-9?!A4tyYrf~_9B+j zCa8ydn}wY0RlHPmnD{_-kTn3ml=DsoN4kVWAQS?HA#k0Bb08IRGZ zvaDy1QCF)#!Hda}YAV|LWg~_WmVWv6odmf|nxsKN9wHt6ドルA3gY#+F}NkXlKopAu`J zTp`-F3x^{QwktU@GJTEY{TznFi=;iG9cDXy|BAArZFBiy;^Lw~NmfW_-=3SV!sgc2 zr;-xyvq-wIslFwD+i)S_=}=pZa1{KX|7cp6d?ag!3)50EesifQOk&klPHJhik>PG- z=Mj2t@0;>?(5Na=!jr7QJjQ30#f{)yW7eTZ*=z7fVJ2ur^chW<3zvt4spiymsw=ac z<_qd{*d?p7vtp#a%f&c$-@z7vilomw;*{r)hagiip=rpk-g!u|$|16bt-|wt{4x8; zht*vAT~enfJj#%cr_H-{S0ZEhjFQX#Gz~e3?mLOA$>$SO$zJ1`MoG+sxfyOLSh!*m z3en$hd3TDmf4=K{MSiv-q{Snw&vA)N_rh1+!^Lh}0s{r^S&+~G;W4m3O?LkSmO@aN zcES;IKN<@b`un!)9ujr$@u#vjwah}p|cun|fcq4h5f2uzfr!j>5rHFYd z5QfJoNMR=KuU)w%&l8^tc z0?D81+SUH3T?c=pdCzNYwrVsaS&J_YALI*LP%w13+x8ドルz9ドルedSr-%B5spNl7SGv0L z%5mbT>s%b>x;$TE*L7bWhICy`zBsP$x@}%+zZ?rMQ)uvYa8(mx(O@+%_mA$)>6-rg zTlf;V*^desP~WA9hzRp5H(=@`M(->7*3f|Kj7m}}eBHwENw)-x@D*X#%jpGavut@m zbxJXVOl~BLj2(e=6tei;ER`V|*L1{W-*icyrdmLlTakfTEUDTMp#)W`JrjkZxaaRR{MzcMVKA}Zf{ik%xa)+S@CjnH;$epBS`vij6P52^fWAnaZRlIvO(nWsqOlqedihHL+P}lQM;93eU%Mk_&+9CP(mN(b)8^*s#27as4DE}@ zk;cC?FXxA#ZF=eD?jNNI?8aDUOnjE=0Il!**InB3hbo8RR~Za<$v=aywy)o=j*17b zG~Ew0d^zM^fqzApp%4=MZ|?U*_;LxcNZ%2KsLsnR(aTM=Zph!=$v&%!$ zHDygO;IdV%6qEmFeMPCR{Lgy5FQcJx?)K&)D*9z7%k=rw=Q}!%Jci)QLE-c8%1T#t zHO8vXH@>E(rgO)>NIK__9}UH$&I>p5+p~EEtOoCj93+vQY;4~0@nxi>xc%K72ej3X z0gxrSjN|Gpm14*P;gT<3m|-lv8_!|peth(lxpuz}*4dw{zs5bgoebujyd(y+^<)s~ zQ$=jDfH@UPh<0>xGB=avFO=iw0ドル-o@pl@rHxzou!kmj3Wp#!19uvdn z8arBduAq~iQeBg1+$m7*!O>AlNljru+xTCuL@^O>bE?qYO#`Y+=S!Hr+R!WVu6o5J zJ8_(I5$?tvSR$cz;ZrL^IqAZ0%tzT7uZJt=Z?A5~*@T0&2Ze-88@ZO$UR>Y5)OUAe zg@;QzJ39l(xiixW8|^M)il`4_8x6FJ^FcWAUUXDNioAz(*?tD!D!onk1fx9F20@fO zV9YY~zDaspPqbaZlyS_TDSkxpm_{?!evi-T-Z3_c4c_vV zfRP|Z&)(tbFNrXN1mH3?dCVrehNqViY;r_$N{1@-*KL?2ekgN+9Aaq z0vQ6`LH~Qhd*r2Irh+ZrQu@!2rfFiix_Fi4ZY>#wd-!IbJpYwMH1)Kh|BN58{Hyfo z)8>jM54`8qE8p48l!;>X32yh#pSD(%sy6#9^V-IJ*o_7J z9+QBpWaGp$gf1gK`CsDO7Z#egwA8<~wlr3^chs@a&p6n>#033I)Xf!gZ@ldD#3X>1 zI&rZzsi{?k9j@U28j2%i$usxf1nXIdSK--V_XBo@4|cl2;yw%x+&0h_d*DNM$Fl$H zxctus9{l{bPzt&E@fQk}4saXW{&lTf3%WHX{uP0T8Vyqjs9|77h6zv$&&txZw?ABR z`A$wifPlIVPYsd+eM-o6%F4!$UgY8WknIeoqe}k zednk*I@sg{7+_b%!o(gMR{`$%^^cGSDTQ54L|SYg^HcUFr_Ag>ZA>;q48HQ~m1a*I z!BMw%aR~_s&wG3RC)uH#EjCm&E{rWMD4WeD%3A)(@2KMJoW;s29PxMhux>qnV-Ll$?E}LV8Bw>y7MwF$vDMra;)sjAX|@D18LuR z7(#@gGX?PUta;Bdl4SNaA%Q4WHIeTbk zXIGh-QTymWpjri7|Bi)!$|RyG}*F(%X%jctOgKQp|fol2hoK91_h zkShC-z}^?(sT_A5l4HD3fI^LzGdRUBBaR!QMr%rPz{j_#CqJG-&4M-3kF!LS

e zLoUrxn$b)6{wuwszIo*I${2n+DFmF|nXU=lAng}v*d+BgxV2ドル;(v*4(vF#EUlZH8?ZZ`H=nJZ{g^|#gTCH7 zI}6z!!WHKL_60_?+CY#_rJ|-H^R&mgy}dm;IFQIoO}(5DI{OhcJu?%Rltlk-uJ|x6 z4h^IuV1&V2UYD2d#09IMWAT@SFP_;I{Moumwfy(64b&TM?0oD5W-~`~Tig1^#`C+r z$CBnqg@m@6vDQ>*UlLucK!+yexN~V#*uQg!avdI4a0bLx-VeY$$q@_uSz79oYIK@B zKL*hKuIGR!);K6u9zy>&!MWY^5P<3)3q#jc5z^d5xpx4|=hueh>WSmv}eOJ24R4PLx|WJPuShdAW9DOfb9#jMAZWvY>7nvo`V;Flx(rS?YdOSsUq zY)XX42xW6W1m3!AA7r#J9lqwzuXLp)slW0Q7@()B34P|OEEOdEcr4a3E@n+GIrl#E z5CMhcZ>;M1JpF!b!Q#OW<4{9-v2l?e!@zfp!$cm+&)mrr7mxsjtn3*@#6fyv*^hy7 z1brT1QWPJMElJJbdU59)UB81+M=>u5&VLIkN|5ySC0>sTe}h9xiuTo{^Pw-4(wDfg zZ#=w!WROHqa1lLT6Puzo?qpDA8b0Tvly^9g6;tViwWBhnUk58_K^irQjZy5*fB(}q z72_b*O-xEkwcZ}XM+w0%!1S$v!S(UKEu<61$c359>G!-I@Vp*84^UU8zAVyA3%#l+$W&<5lwxzhatajcylyo$l%%em0r2kd80*t1viz=fkbpr z<-rqtncnr2bm4{x*y3xavub`(myf@)ozdpg%bos-0r_cqu2=wvxai;>di?Zz;cS93 zG0Y?%nktEhS*lUx@Gil0?zkUH;v_Q3IdEm?*kNReAr9zD4u6%ZKK|ycncztMm;zg0 zx`AT};WHf>l7ドルPL%GNfE53o>!Jn1o7=rh_`tbr#Poi%%AO{HO^p4$K{EQk+m-*Q_1el4g?kAxo0h(RxBi}LdC?2m0`gf1J|-p1Q^Bh= zJA*kDcEdU5;8-NPX2l05TDvIOU(Lk3fohq3$YKKTkm}?>f(_#KnmuF*sgLQG!8EA? zs+K?rZ9$jNR(WI&F^+S8i5V$! zmqwFV3Qjqhl(u$V((_X1j`4GuUiwMS`yDWszIicDT<`%?45j7ey&c~h8zmr_&o^oz zw2Ypf4`6ドルzRyKrT%PHan_3h#~n5n4y-o+47vr8e|XiS?}`S%L8Ym*t@VnL5#ZU^V* zZv)mISJ62-Vf5}!TtXf}?v1Ili<2xk1$$n1)^>=+njR)POI!jDIz*kE7%q)VAW2nrjyopRTt7A?NRN<6tkev*m$kc&43)xy=-&^| zp?@`p&PAv}i4NNt>$XAM+W7fRB~>m_V=J3<)%yi3`e2r>5r=>I%hjx`kB<*o`{wh_ z93m7cI4@U#zu4S!1HQF_G%{69N9;qe(a@D7N@- zE=_=v!JDY<%!wxk^*b<;wi#f#o_z?a`yz(o#t*sqmb8mxtd`!yj#{^nx1;mx9+ zEcc#eIxw{6i2p75Rcgy(K&zqpOCmhn)+9YK+{%Q217C(we);o8T?7K+G^u(fJAdT- zfEtVBpQa)dxQ14_o>gku?tzR%I_V?+@|k#+eb$m!Xaq!=j3>2ドルtk&j`X>`~KR0@1n zTG4mekv#HQbp8-Zwmb-a=@8wmcR4}ACz8vuWK(tB)aqq2q*e+U{8;zavcV#iV{WX|9I7LUJF7C_>Z^ z7Rjk-apa#9SiMEkk|)VT{Y4e37c)F+>>JlmAABv@p>HQAq8NqiEvpFOX0Cu zgX}Q*9q0;VG>?Avx=N(0^GK_GNXmDHw>NrDGYnR4u2Gm@UNeH-1ta);-LsTpgkeBH>=%^6-Foo};UXDTQ9DVE?FOwVIx70&k=-(jDgrrPJaFOx@GFEknxRJj^ZA1$KDm|M(X zm|nX2(0AlH4fHePrDdh32rr|D7?#tTHo|J<%;k4wqqt0yowp&_b4kcu3wwsu@yvqx z;d-_zLQHyj{{#lCpWmOJ6rIep+f@OboMIrl-f7vqsLlQ|n!M^XGbCw{EXYcrO@r8G zH08E{K7y=Katey5>3Uk6;HbTA(0Ado*4;HLeh;%j5~_B1#pWDuDfK!xk5k}H^QInj zGU-or$*;IgfAgCY+DPuDd}}Kxumz@9xI|`}HhTGbQ_0jJXJRO0HeH?xB^P4ZAQlX zA~%u6`wwy*%|0 zQ$U4$CoX3!mSlCCwFEV$l9gY@HVH?YKwuO_b=+ISA_nRgCSRr{;IW@! zsA~ON5??f6AO-{QL+9UjCPrwhZj}Y!aHJUJInpG+5>bVU02N0;u_K^0od@Qe{0!+D zB!-50HAimMx+L=;0@`*e%rFE*rUgUfMK}YRX15Th2nCmoCTiE1Yk5UJ+IZWdz-l6H z@7ucoh+Cg5EBY|P0poR9@}IWk8;Q6K$&qOchhdD>g4o5+$!;PePV5y^I_mKWG0^${ z8n7M5XoFYWU=pAKpfSVS)N{{Yfr_^&qskVg!V#mwF`OR zattP>DhDnF=3NmlTSPx2N$+wkSs)rwIASt}<`5s5h=mzpr0y1wimfmw&(MF-R>w*(={qAs5|${KR(M@wykuZKRU7B%F0CzuLoPUo7dk2+iB&g zS|!~6unn@a{_^>QlVeGUuIVeXU4s5Lzr|8(C{a4?oNE)a{b_>o8|}IG>DpzONqkmT za(=!`dPcJHz3tFn%|Q_5%)=-i9q&mjXn*b)c*i!-sI##;&`XxWfIcED*}ZD;+X5j^ z2~jY)^u+L#|7ZcMB6(?$eUsDPFdPX6lzI)Z(u*s8bi1iA25o5Y`*k9l^6mWFY~J49 z7EHKI3_=V3^p7+HeAKM{6AMFV8iQLHu#(3Frn1B^G)yN{*kYc z9h0wQgkgad_J-RqJEG;gMtTrg)p{UeYk9=F*x&BBh-y1Dh%DFF(U?9nGNt&Vv@9=;kc2gayJRN@rDg*8)wj(_zA-KdQ`@&N^t?3|=2%oYY3Xk*TAQ#6Z_F}#tz`CrlNXI$ zou_2f=dCS4KQk4a07gLW?OPm?g>T5vS$>IkxJI;#kQ&ldFWz5hr1mEm>+EF&>|3ZB zi*MgPXvC;6onyW79Zmozo;>H{N%nb^=E64$O9;`)_^;7w@`2Oer_zH*2m7vV%b>)> z_;*rp6jxn&`QWc#1pcsZG%-+As@aL=+cSQ(g*b2b#QA*g8X^nDGI8YksXe;>G>?c< zXvV?Jd3pu%_l=F9&<7s{!h{(=dhg`lel3-~bmwq{0vi?ebjlmpr=sy2^+slvl+9pw z)1E3+u0wVpz8ドルV09K1z7E2;VJqBH(c#fz;i>6F?fiUDulHmRsF8HmLm_aT@wD9Fv^_T}d4^ATYx#aXne(G{- z_cyps#}LEh)Rd&~m!@Z<@b}>%ja17>D1Tn7sEN*<|nh%n*pk#|t;zx3tnz2a=$}@d z0*NDS5l^p9g7r$a4U@(#O&3cD$xUtcq70*^M?+VaRpjW`L$RigG1il%k7{lcX$dD_ ziJW3?3``GXg1-6G@@bo=I7VYZNw_wp&%6Zx>wvGEpYd=K%4#W;X`7ginO#ec)_(fFpF#U<);j&iglf_^r6{|lp>;(b@+xx zx;R(q=)Nb@X9(R!tB;|siGyxI)#rn3kFz%4j}$>?n3zube2GeT+ZO$DqQDTpmW< zy?vFTH4yM<*yxx!htp9efhwoj)%q$ut|$|z375uw$kbap01ih~6to-ip(krld&o85 zgS(`(fQ*9|@d|>Ys8E@qwZ^!$%vjSS&47YzaY!I1FKMo*LGFf9Ncg_7iH^%OKgIme zLRT&yZzMj8rn(Br;Q3UA1-Q#60T$mFfX_gbrJIUfR_iu#7m7F*mB(Nh>Z~}2FNS)k z7oQZl*3sd5C07&4h|81NqpQ2Z3Pfg`8p-jL?9Z<6hv%0*_k1}tt8stwewyeurwkuo zhEd0#f7^f;TdqJ-maH!%Rj=0DnC#v)*ji^pGJmV;8Gmd#i6rT$vhYqNG0xF&(uti> zx1ISl5z*JIM>y4&-rn&1eDV)JX)Jz(WkoMEz~b10%G#X5(W=JLy4Jo15rrb&pdp-r z&sY~sipr8vsioHYn!TN#iGJEQp2nLyoZRXEBk3%|qU_o(Om}y83?bd+&`3#1D&0s) zcc(N+cS^(1ozh)WA}uH>ASm_i=ly^Q| zq=qIY1=-nvt_gual9GFtRs$;>3SCGi*syxo{n&-Zds;=8S^KrrHN}MH)#Ps&E*?W` zrfZh-zQxxWr|t@Dtt=%k3nt;BH7+mp=<1lm>@1-3S5rd&jVL3RC3_}xZatBJX8IYL zk?t*jk?`jDu-29^Pj$^z@Q^8th?#Wy@=1#GKsL7q4Eka+*w)B|F7Gip9R-1Kfd^t_ zpym=72@718r+P#FGxq-%o+{n{rmYo=e1H)_92@Z|7LQbucXy6=muOcYdB9F44a*~a z7ebm^03lGgqN=ksdvRe^LX!8!<=0cm zJuYM&p%a%10~4LfoRjM3X%2Y-oql^~!_x8!ucTN)USmuh-IsErBNci_lh@p|Wmp*V z&&4Z~re900BYT!IWUNmi@ex>fzb8c4VZVEOd;O(?ZfC=p`Yo~w3Y;As)lOp3@CG@M zxCy$|*Vos5%PaU*rkf@>VUsWDN6?A1!xz`C=@}UrURnMjHG(;qWyrd5HciU?WI)*1 zUvC{Cs942LvgNVI`j@!tkJ-*=FUGoK4_M})&3*9dff#j=b#;wif?#eY3YT_p&lOxX zprJr1$Pson?)4XiKt8v%k*1Z_Iz#E6sf`JDby@iNuYP}WYngsU9m<(ax5%+fq+ndt zm3Y}m=(4zZ3&aE?g5*!VHkQKA8h zs<)h9co-qcrc38Q6`p;5zoLehF`nQc^kiit+w9~6~5$M3Y%;!GEQRt~_D z3TBFlw9hTqK81QS{b3hziNXb#{pu%yLx_DSF{HxlbNWs1liv?~E*?tG|q&k*O z4W6LObxjP+@f7ljXoS`{5C~qdW$xBLi;U_= zW)y^w;S6N=$GKww2s{Grn4Q9+B3BT~Wn-%>cz*cd+;c-hMey`|3;$FJQdPypyPr7p zw$J;XGM?+~;_QxgZ+{k0k74IO*7_dB1az(YE=(|FW2ドルMNy4VcPB3j?bcx{ zv+lBDl)?sC_JpuI({jtOo}irD1|g;QE47CW7yXf#ZGllik1eNt<`t|#kdv*(9Wp_(`O9gSyEhbEkG?Mys2j%I}4H*j99L z;lUaJ9hCr8#%0{?{pVzj-{gi4JHFffFDx`Pv^zivgq^fud|m=O6r@(lH>%i+cwntA|w8~o4tR5CyAmA9uu>1@wkAmHSUF60vq&9xMej5;tW#G%ReNE4cJ}i5<#ubduqjalqzj}bp>5}UL*Jys!OBe2 zXb3(xhm2agC$J}BC7pxr|EzE7*FCQY-Cw~4Ju{KiSKz!HJT)GkZXQm-|+epas$#^SfzL9#f+;sp> zMtY=B!}8g;l&JWIZ}t3$=g)wok|%`7kWdSpu`X8}KOd;xy0>^h4QMGTQ{9`G$n#B` zWB}p?NEUc3*<$x9336ドルouv*9&yk$g{{2badodde~kpyw|n!6ドルyy^z3~ta~k*lmr~a zNeK(LH8rJTiRb&a^rc-O1(Ak7p`LMmmI9l3mo7KA55MexwZAnL*lwpW=fa4V<;6$e z7o8lwNyCz|MCV~j+rgML(;MFZ1W}Yj!PJ;~XO+KTTF#|QPmtpAmifSec=JNRSfY3) zd_+BWdk3i)=_e6)FFc{x7qMZgSoGr>hVwZxm6JNO0tRGH8L<%nsxe)yl*uybi*n(7 zR~DENj|lWgP-Zd$Vp7s`DZl3brW!trQ`eKjZs47U1I57oYis2HC_p#xV!bEast~_$ zTT2T-$srQ~jw5_eYjyQUZ?A85U150$Z(Voi;C+oqZAcvu31M21`gj;2c$Df`c;GvS zttXmVvKAkQ&ZDZNj#o-zVrFn+sUO0{urT@M+s1U>oesw|_tNqb4JBDD8hSPRi?+7b z%d0=*voiswvq3axluFU@lf9|Q8F_At!|tx0GploB6PpYY0#hUFBhc@`U$=^iYfgUb z8R=^I9`DMld#D}eVOcPigtv?IckhG@L^oVqr|F;?b!|>@vPKzg(d4te8duyB)zZ~} zZ~gw~kAu{#?DC4ry!6bPs?zs0HX3hqe*WA>i@$bpXH%M`*!5`oR*O%&$&jO2SUJzt z%$zEMhcW$g2ff|KcZCy#p(C~0+V`H*^S6+U8B(E~~ae)^~ z$u>GChjP>RzX1|!xFF71KbQkh%*~vg&ySDEX=w73lQjWxaAN~A44pUV*(4dNfk%S~ z9RN#NX6CZu!QwAp%IU>RjL~XGk@Zx8ZCg6LUt-VNKyiC>^kL5O|&hsfYy;Y5?k@LE8y;X^^$pIBk zMneS!6?LbQ<=!)s^8mr5S-y z&cfWh&<&kyb73-?iv<=e-xheiqtogrdldlz{k6>iAMQO4@ob*94Ik@+^jPYA#z(-@ zdXiV9;IO|IXl`CwVhoe%%-*n$oLl1i`tSQMwXG062_7;<}%+- z-<)5r)f`^s&ypbhfayao=h>^da=)%yJ3CO4QkT@1Y%I(PND37dm*%>5ドル~c;nzI!xk z^|YB)ib6p;b~q-oJmidft%jZ8qCD}J@#Wma>j5-10_ufDh{juvAfH#4Z+f$n3w&aFzHxXF~`wE|3;eKsEbPncEERbD6W=p7YfE%r=~c4?|a4* zdmM!(zFfx)fDHV7IKr&{sKZoqHm?XIb0NMJwyNKiPB>dxp-dtva+3nDa_y6o*5dQo z35U}w?J*XFd(2G>`%LH_u)M}DLWgpC0V;Tu^P~Znj%g1D2y4MwXmD`2%y8&&?b7ss zS3U{MVgDvjZ7l->rJ!_CLm^xrKt@=n6X4J8wC@)x3$}?Jl3b~rS2?&@Nq3G%Q3j0> z!mn3UIOFjs@nijTOVp0<71u>>P}ar15`SVqkj<`gq1tzwaq2$(zu4-2mbqrxp*x^w zQ$j2|yJcDMwhct){0c7rI zXQ!hv@O&T)e3lXl*Lb75Q3A(!q9V%Rg$?9(cKX`b{D9Bjd4#9ef!lNPh7`rjeeI8?>}3B;1}y{6 z$-ytYLZkhwzlHN)%8ドルB?=G`D77WqdVx9s4>O4YP}dW75I7t)C-r>bJ9jC_rQ5mHR$uoTg1NI?gt2f{@uSwRn zv04OgcTLk=PTFx?&a)WrY;hw}_!!Ko1a8ドル?Dy4i*h5@0btFv>PX5gxI)NF#VJEEtz zH_+0O$u`_243Gr26^2eDb8y;>AMEbRQM`?$F~cV@#f05ygLw;`2V7kGt{6<9bsi|v z7ucuGjg1|t`5hkT^mC8*iD%A|OwAGK6|~7n)A$o$OBnaLpYf1rh%}Y{%YrI{>KAi9 zReAAoo=<%7$+ojx*yznqooabwzgwnpq5rclmwr(>r8B2lcH9wje4FoJ(Y#)1Y;_*X zLJ}&$E~FJ3UE5ドルmfYT1Af$`bY6ドルr9vNzZ?-E||!R}r-a`0barY<6{b!6gu!d(8-dtvg_ zP9X?Ht*@A;`Q4|b5w%OZeBAl(1OLFn%GyWr`j`}N z`$cdyyu}(og|;iZd_luFa}c>hMq1dx^S~R~1l1GFU#xN{Zw;E|2`B|@WXFmK;;=ZT z50xfP6f`)sztSiHVQnU%IU`n|&xrDuk?%hWuh<%ldr!ho5uy39y`o7fysq+vo-8mo ze|k|99l2&g>C_+WLKsln_0}AIssI32(l=Hd(`Afrugi6qiWJ|&fp;?f|PH4WacrXi3MIn~hp;Iq_= zz4`K~%kAUv`!Lu39ueO7cu2Uq;-zlSwXn>3XsB!R$O_uHjSTD+_Xn;pfk74&G#{%L z(%D?l0tr`Z1y})RU$;Uo`2D>KO8_VsfPYwoDHNhLqVGyBrf~oRX?PXq`o)pcHb%*) z#ml@IQoQ_aA5Cu?_*Sq=0K^|RJ}mApvDV)>agZ7H&mK9X*8 z3CJQ;p7iF-4Q?@f@*?7b`Z@}n)`BQ?ap|r0&}IeiVs-BnoLF9YruitWff4GipT zY}(q}+w0>1;DDeI!P`b^z`7O>PDSd$Fe1^#bn7AD9XEm07lm+_T2NVlfr! z_SY&J;nI8$y4x92q=mG;+VfBPkZYy&FoTd5L1iOUHzxL~gTb z*(Njb1#8d2@k9FR5@wqvfqHzbeYkh3@rtmFGUJJ}ZN+UN9aJfR~B3 z*THkRfx{oFdotjj+v@891+)?DKqEO#Mk}r{(e__JXGf$>!e_-L2Anve-`EBO^n`|* zySlFZ{5IX?C9I3@2t((mw-$L1?`k&4WYC(5|9UY+=II+T%ZmlF)>2!G;f;o86#fWj z#<0n?=$m$m#uf%k2m4vxq%fl5tssx%dfjeephfutcvonvxjil`>-Z!0+PrCi_i){FLJP-jf{PFP-bTm0X-b{CUH^UR| z*{1dAM=qdUqNomghQftKicqa>rCrOKx+cx&|5 z_?^CCX4aQZy5HH6-6NYp!K7nz(7X9jFgNG}u*3j-8WU1H8P(j+lTjtc&Gl|!VacY> zX1@>;?kS$Ll?$#v9Nrcz6Ma~Fu4&!|vQUV7&vZ7$DgHc~9VP|^+S-g2*bwhP zJbSRA-Zu|llD6@@X`yZ6aA4SvDYH z0TEX({i{JUy>ELjY|usMsL7m8rKP2oR#wvDUjbDZ2zg6O58Gk5+bd9+ zD4foFbby-xgl~7y&UJMK_|xnF+x7Ejc7DE8<{ot&a-mjnada2=bdsiyw7#qzzqqy1 z8sczhiPQnN>T(jah(+yxk%T_emIf!az^8szi0;K_2=i57q*A;pwz#GV_ePX?@Ni)f zpgUTKz!Z*Gn^IGqR#oLtncT=RGG{0m<02e0pfii}+x;)pa_=^^bg3u_2^a%f74gn| zJ$f~%GD(JD3;3%NG8hUQKJ?-z|C zFW!RC&9yoC%F^c}oSv}`tb0nc0vG$Vc{GRFd@*2s*jiYS3C7z(z4U8{g2OY>(*vD7 zdYYP-5ドルMUdRFU;EblmIUw&?8aY-LqebJ7y}kWv=WQuc*AfrM0-JVm05Rm^teOGKAW znaPRCR!n3R%YV3blP*u}!WjTt1%;hrgwZB`r!5&Kfq1ドルOwSjol=Jf5ux{V8v<^tm_ zK}UZDn&ZyEc;f2fg6H%Pd>#Y3&I2EDdlU@~*S9_m%F;g#LJdHlBg zpdrV)<{of~-ap7pzyotf#4=(m?zfb$xq8#1smxdkgmd%t#v^xa>(*xWo`E0MM;0d5 z2VvEDdP%7p-x)vuSlSB72@pZZQOmda~Syh5jXoMr2CQvdJ~@;kMf) z73DNpQk>(5huy>SgoPAksn^i(%2)`z9D}3vuA|*-kUwk4KuBZIT~rXL=SF-0{32|C z00x%P`1l_8;{~tYtGx4|=lkI3;D~-y>&<+`z4+f>Wq{!Yb&H_MVDlHKobK{E2c@h&RK@% zsQOwhexX|7(wzJ{-X$xG;tTX>=cEeUs|~;F8yR4u2hn~H-IVYU6zuQ2O)R*$xlB&& zN%s{mOV9>VA2~ir;NOL^w2d}GLV{(TWmppo;o%W5R;8rGNGJ)l(@YvVy9ubsh)4*2 znx4C;>5>FrY_2s462IX}NWf|J%y*($N!LY`?9nI>sdIW~g}s)efrQ3PI(dyg%{phT zy0MCnAvoCU>)VL+TX20fewx(~gX5+5xk$Ildpd~=ovjkZ#H#9QP{#$Pb{w8BzGS__ zP-B7JqdpKB3+7?%a`E)F^Yr!cv?l*T^kQHKD}hahPd`pAoI8!)9KavGaH*+J-QFhL z{YA?EBt=V$>a3xxWp1eGHw%3}x?b8{8kPzAK87UmJB-lZ*cntJ?%!>9ドル${G?@85V{ z-S6lq_$HJ^cu2O%8>{p3GkT$H9X5&*TeVy?*e0F)qTcbi#=0(A0B`8MZxsBgFS4u) z+8Zw~Z1>Ci>uapNy_DM86S$`emLGndsAA$sjIya3OQz3cOUS<&hf)`{f$bujo|a($ z9>2Ce?`5KyKpLirBZd0zc0c0a;K+SPIK_5SmY0u6Oq>PH7pbJi-aAIXhu!zM(Fa=G z;Hu#JJ~+c0&w`w+29jCx`uFcIK{}$l+y8v42lv))c?2hk`a*=B-Yl{H;lBr^A*7+b zos5oYco{P|>HRnd%$`Us9wspv{f{EA->FjGKOQGx#*DL6FFxglugTKlU&m#oQR|=Q zf3wfO?}5A2tM75PL@~jIo&5^d1phf@kIA`(gjxz>BTm`P_}zEt^TLDZ-OTiog35m?ZAd2R z!hGRjdBEqY#8@Lksj*~DoFDicc6a9uH+XsJx(f%aCJx|5var~L(?{D=#))ENWkr2F z9vI1t+EGEjDCQO4qND3(PtE)EQnEvYzXd569z9kmo2N39MIktaKHSoUUZv(lCv;oG zNuB<4@e^|v;u62ドル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ドル%&%)1kw|QtUu*j@P&a@J+|}?@c?@ z9wQ@Q^%OTXT>)(ZV9UetU;CMY)MK(KxTU`JY|)*Q zN#(>t&@}yU>2IHjYl25rrccMuhPf#1?d{TCSyWy6xg6F_&qmMBOV1dyGnHPRUlii@ zhFER+({x27E1j+jjDdYu&i;eC&Aq9SiixAzudz8f2e;R<0jtcmeot4;t+$kwlep9z zO)c@1y*X{XuF*^-e}{W7|FWLU0YWytkKT8867u zlW_C!W0EWg`S$ND@govJMJS7*-p@~uS3hP;;%6o%w64E<<0;s={=(mlzkxtz;qst0 zPOgCk{fl-Llg*T&BMd|!@~4xNJ~T!_HpAz0T0Ro{mlG!+Jvu)x4M%UFJUf#nsu-N~ zJwHE>ZD^X57>+)VjS+s3#3@*V0`0zvg7QjP$MY<*5_q7~p!5it{blpniuh$k;iL&3 z<&l?ni@dw@mk@eme66z62zmyb?i%6hybxc`9vkf^dj$ z3qk7^O7s=j)#jOxS(VFPC8Shb3IBe*Z>-EYWd(iuIN6;|MP5{TA%fo4cKv+TwumtJ zwbVuCKKxx~ZmvIY^HjRp?x3xilIT^GLLZ4u2$K-dY+eDb2KAI9894ywgJK`x_Tmj3 z_;%pYogs*V$;<&k8vayjwtswonz_dgb9rtt#8cd{k(ljvvc$<==_vuscljhg&{xt{ ziFkIuB*1j>CrO6-^m#us1Uga#!3>EL792?h=mdCXF~ApGn@4ti~r|;y{ZL zg@D&-h~wgr?wvGR!;j#kEH*~CK`xB&AtW?Z`&Hh-;_&7k!rM5V(xv0VU@NB|2!kpxK7tU}%ceU(R-mCLN}3p1d)jIY z>1~2#STZ5c5=@{mFrN>OURAth8lP&O<^3by`0yscT4G|xhT>*Xvu3Jmjvvt#W*AA0{rQ;UaZQArWmmTeM{gW*$u_Jb2VGqs@*#J$=~VcY8Nhm1H=nlsIe`7XaA0~J@zFiHweK!Q$prMC>gfUA^c!t$ zxA7F_zURmDmrr+lkN3BJ-rl(qKEJPz7w_iBhT3v7ezw_(^fKJz?Hs#3E_LQ69bU zME-atY6+w$E8-oUlm9xEQahK?&uyoRbEiW&J0>V)n}8#Y)OXM}F?RBK=OMmdwvaX+ zrjv;=HUV;F9V9Np&T96uvnY54c}=jiXKO*;oug6kcGd@gqvJHQ0YmM=v~ zw@-=Rn|6hqm;PH`rTIlk{MfA}3-a=-FU}&^zHIv1xZ*>jqc-2FmJcdLCGfycd90oC z;Bk_trzCe&(;S~~@+Y&KVuw6Yw~At`~BZ-go;qT6Hab#bye zA9v(7GjXKaE1`FtYLXv+=M_Jspxfi5%uA1a6}qfZP(U3hi4z^Gr`!K0e~cjm{vNKf zAGhT;w|U5ドル@~GrQ?@u^uJw@!z{Kv>nx8F+4y^cDn9}NnB7xDcEXdP}Pd%gyxb{aHb zdkA`3%+1X~+ax%n=STn)j}dFUzrP>sF~BCTriK%WQy9fCs2^>+JF2Aw`cN-2Gq zJVlY`b;ukr41iKdcpgL^pv$`e`@O;c+GU$AwY~uPvaJ4^(IdKezHsCo2IbgOoE6F&18{ ztBFK1SZHHgDA}_Pn#%=Z!BoVIL}!ZxL@j*IlcwtF>~0$~r#>*8W~l*j!kA z)$Wj14pqmOdZ(-9Z0Rk)Si2qF=;QdtC~=zr+si9q!9q($H`qkq&h>GAC_PyJ?5CY> ziYT>Jc$d2HiWeBE&b8-7{Kr%c45s%#zX@=(!Og%SX7M2_!`;pQk_&s~dJahDrqDKoEMF&{#%9s*8@?bRqH~*BJT4#bxTtsPDT9%x0Ly~(c zpKQQjh^(k;Bw{7?xL1_2#svjA1(TcQ5#d^(=9(nh>jI1J@uWb_oimjbcp1+{^g5HY z8agCAHN2voy$ zP1Cw}T_~n-?Cu^Of&v0*X=#?0mT+wIXNc8vg_Pvvpy={sy#;f-w4wsFJv1P)8d?sl z)BWs)n1>WDzrbt-&cC6i;DOtYZ$&bT zldtexdr9E<3tz=103|r41i1qo4rz-55+n|pqfyck`e#k$exffhr-3=afretw6@^qx z>49!tU_f2BIeyah3Vr`O)hGByRUU~NE#*$*&K3|2yF5=5Vw8{VX-|LBZ3f1gQ5o0Z`h@B==^ojb4wo3O~3D=ZusI(t;pjcZq)& z^jGQSPjlO=-;~)q#UfeVIFvDdQJrkMH)9J3y1O+g?-gr*@?*@TAzDjnzNfh-lFc8_s_Yoy-@G4;-2)QM(_B<4ドルgzsdwii`nj_{mbw&omns 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ドルGk{US-wAOOv8;1L0dY0Zs;mE1O2 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ドルQND{IWv8w_4ocD(gFW(I0N=L=VfypE(o?J0#;J*19RWhO|STV8BZE zwTd~HW~6|8nVw-GAdM*_Ux0;OfhK((j~}nbmPu}6rPZ@4vA_gefUT_P4TKSXp@+Ig ztzQODGB)Y~IO!LVRRo4QgwvrLcKi8yc>HW^oZiSU7&du+Ie{CYZG~`O8X|UH2vFTK zRi@gaPUJ(G@uby9>yX8NT=aj38G z^aM;P(V;PFvJDBk8tgRL!u^zmrkJS6;RA}MU*k|7M#o4=;j)W`hZN z1j5EJsLPoeU^5Uoie*xkT@uhxulC4WusThT#ny;VD#}}gKpNe%8?fjGb1|?VXUbG& zA{AK8&;H$>qH~1dK7z|oY;0^aXSfJWp=iXB=g};^=0_f$`&Id8bxe6D&SUWBn&a3R zu_(5*EX4|iYIvBZOaVEJSzg!9(Khc!LW{ehhwG^i7TTI@Tx<4)@8n#mo8b7jj@igm*9 zYrjN=Rll~~vDMPpBRs71HwM=EfT@PNO0&do-5QeSeb&HZ7ドル~3r>a3rdG9ehcoPHE7 zP3}3&MSW~(>K0>T927l5thk6s_wHz#K)Q}g+B~8R67`yllr+V;y>vk6$#3j`RCqr< zi(hUC+#)G>tYy7fJ=cq8E4P`Y_?HH=0B;Cu0}jelA|Z&eefx#JR3vpQI`Ie%XCf|f zA;={tX4XyNq)%*0`DXT;qT6ib-%)KHUEP8Jb!YTUm|GgEXVyJ&&8*GC-IasK>wN&u z)+3LOjvC3fpZRFZK5!3^*|1M3Yz+jjZ&L$r8ME^)1A#keot1XX9ドルwM{y z^zWjv)d4Xv>1Fi&Fy=H=6DTahg0f7U<74%ik_hlrkwgfh14b(lyj0zg?9$?oz z01wB~F)WtW9+KvH^vsH{PYBYU7=$NUCQ+5X%#b)-K*rbuP zNis%BBXC6h#1yKYXF(-KJ%P~hV8Rd{9uDas2>PLNH{e%gDFoPsmgnH2ドルic6OL}hFm zhKYxq_vh>34G2Z(N~S(O9l@RbskcN;MOa>pLJ z04|gQT={PUX?Q}LRD#qYtik8koyO;7Qc~ab3J{CDJ4C5(FD@49{kFS0mje9|FQ;Iw zB5??YKOPQ$B)HPS7a_?Q_TcAm*g3Q?Z>$o}sPN>-7`|f5@X=E@Q`i5xaQVGo`UjX3 zH2(N8JT@lzjwsw=bt4S?R`tS`}E)FRwzJ-~J`r z>OI{cU79Yp+~Mr(3^)nZ<9)t_$aayqb^|cfo&v(ujt)uoztf^gz2{j*&z`4i(3on| zhn_+iaiZXII1W{plGo1j#&g1$M;Oo@&`=kJRTF&}E_~J)tAwLh6&#PdXkffFgTgG` zpzRg$Q%C78gXyk;nI~bugKZ^M!-dT-pozdDIP`@N3?ljUu{PC>h{u-K?L}Bk+r&}CiYdHhlgkWkqQqF4<7zmfmg4mra6!u$=xd7;t<5tesgy_ z*%#_y(M+%?j&*gt>b_o}2@>H6s6&p@EGOK~H1(Rif~V2Aam-GAy=d?tL#cE(@@>xVvKe&@Q~<2pl)(}qfw&m%(p0`bpkx~hbolhk1g+m*{^ks&(3li z)(i97@}+yA)-14(BPE0UNJI@klD7f_;Cot`Ke*WhtUEsgt`XEm$|~`h~eA z@Z6gM^6RfE502WJz3;+OHDUJfYFB+BIj?%<&s_b{=7hk9y1vp*u@iog&e$;!{qp;r zAU+(^FvNtJpqc$RugBW;`ra7yRSBFOVA2fOA#bsz1g;MJ4}&v|92rpMazeGeb1-p* zHM-sQIjd?-KMIlj=1`hEg>I@>JvWc52c3*;>!CtD}15I&={el{KeTd z?;=n0Ad|jD_AU^rjy;A#Ry6^#PuSi~@z11gBpJ6AcFLlSoL8x(UA6y3=C>-)*7WuF zUju5l_M}w4glKYlJDRK-`Vqq`Y>GUPRu>l!?CiXUj8-;#jD?CpNh)D-mZPM?q8h!X zyq1P!puz>(TA;qQ2d>b6!`A8%8ZKaUyA&?^JzS*NoHavE;lFBS^5u+n~TFror#~|d*=&m`(ZwATs4Dk zLn&@BCaJ9bx;SS?t0y2nT6Kp{ko7>O&2O2$#OcVyzT4D%JRU5Lj>sOpQJ>=lFErgW zJI1Wx4gc>7>7?+B_W9CwZZ3hop4G|jahmo|^Oi=3Gr2{SA&$lrU+b}j85s$QBEZ)H zH5pj{cXpB-!2V62SWSCwSd)EN`FTH)Be1=_E!zaN>*+|H=EuLs3(mTPc27{$e}71F z`_0_km_Uwn9+`5N7}YLE&-oy^kziod%f^k)hZ|6s0DCETHFd}aRcECrLnlHhdzX^G zTG0P8i8ドルpVe@Lo!qy@wT#xK=uIt>w>Qm3*>qXc9#84Dbf9NS2C9hntCDfP$gJ?ugo|O< z+Y2TMO>r<&-ITE?l>7!QftN$m#Vj@rJn|LmkGb}ec8=A_}H!^p@8jA{Ylh>q+( z9S}En{pcYJEb=_-Q|3XVs@KJet}W90G>9rXWLDMV}DL319Z%1-f+Y|TgX)6AS<|b}{dfw>i4znmjKSH|TW zIBA70!~LYxR+H}1%+SBM%%?f;9NPD)N9_ePwb$S=unk8TkAw_hSTy>wB2dikMI6>mbGu%FHcPGKME@; zs4M6!=lE=z*!a$iY81zuYL}YDNS$=F^L>oZ(@A1?H*1Vj4@wW*y4_i~v0vm|1+cn- zs8my)MDO=wW?}+7d|2W_Cs-Jm2h1zANkNQ%xv#IU4;^Z1YT(2HUmJonJwFdGS-?Nz zBbLHMu?R@!MZUndE(@+JldeBr`rWHsP1cn77e4z&LoCMgg86o)tMPXZ1^K)}QT3X(r zqKaXNQHbppb{=fKagl{IhRc*!Rgv+#SQ_3Hi6TKTfp5bX)Zk)mg70h2`XJ->PVyE_ z?q|G^^fX(4KMJy0G4&(<9^*DZAsRm-#zT!xhw)0{pWd5p%m4^@}lQ%zVjOUTc6Joc=W z(c}^fBOr8XZv6E6w~-2vBt`s)xl!#1*6I0;K1M@PR8Ibi#sd_d@$qr0B5_h*=jY30 z0jRFg%N&Pd%EuzfJ)*F6x?qst{KyBw8N!{`G>Kw}g|H>mU{mXN_)RcUN57pRWnt4Rt2vI{E_!@5N9)e0;5lkI(kzc2;uz z!8B?HzAgcz$mh8D_dLoh!&kOuL%}pA1e^3aNt;>sWQNyQ=5ErbXJ@~=bq*>5oGGmF z3Ui@qrYMV?AX`m}He~WXPWoUa0JbTV6cpJb=p9s#3-q_PXBK~L`E&AkNtF`xjf6LE zfGh7Pq+MSJw)l7GdL}AL%C(=JcPD`t4ドルXf*%ihrZ&ucR2adk>>`f|I0+A{1{QaLP*iiw#pZbxl)}ox~!w5Dq zB5@;hcy=sZV1J~an+$DOsD^Eb;sW5Pu6&9z= zHi15+SNz3lc3L5gWixtH%*x6tFfb4xF-CxbCwXry<;7xycx5;^+dkf7v^4g7_hdrs z#t;9T^Ybyf&ac|WgaAqc8PmYn7CgSaZP>oq*X?Nvl6uOQFETL8)M4ZXOhZ5b5lpyF z!XVmvw^a#YabJ?>8&`)K%SuC23gWcJSx5+r+Z8*qO_i^iWOaJ;{XryBNXX-Am-ptx zzi9V!qhc9CbdJc@_ug_eVc#gmLLNyKzK~Pi+T{BU%ONz1w3S4g$AwuFEMqLBQXg2_C7S0va- zBViHNlDuh!3Ho`U1V27H0+9;A;y(6k!tTds4>jH!k;@3O*Qee=Gv2(rW;72)qUJ$~ zt)nBNI+%ZGWz7~8u=*6#6{j&|6Jrw(oSc-QmB>JkVPT z7{d!1t%%aS?+X1m8I<(ut|b*uekifjjl`w+>n(N+s!VD^!p8aex!ln5vH%MUS_#_t zwhwBwDwHhfJ`0)=5fNKC?Ho#+p~S<(w8ds8)o;i-qr``_2<96zldd{fmq)5yijpxl zuaGmaJ4#5x*8lvoz^*-KI|ypi#$FRzC&JAWz$oqQ?ckP8Pmfpv>9!emd)0ドル?$|^sW zuQL>b*Qi5hMmYU3OkJoX=@#eYyLwc_i5~J+QrI!??wG*ZEEW{0`!}4ucG1XD)hPeI zIMo6QIvx6dyFUFsZ8&Zjv>)2%iSYABY1M+TF-At@+f@)Qw6FjQbAS13Vqzj_ z^lWWxf>C0+9fl@wnjn_w5gs8AK-BH>!ouwQJakQI-UI0HZhtFjxiZh)+G(M*G_HvD zk71-$XHa1!Bw?_1O1|Gkc05!KtS}vFaOEIiA==TIxBj@?@0ドルuqLEuHR@fOMm5@F`V zgtDbHHgZjM^#{9^pEjd+9Sb{aQDLt~G}a0YZUsNHQVv6Q@CfB;rY;!K1k%SDd5P3M z(=;LsvbR43!Yn+p68os9EzZIe-{oP$Ak~N-$!C2fS({i0TH%PKXtT~;G^!|IDVyx; z@c@)oh$vOE@=r)96TQ7+*joHz=4)yf&4T18C{Eozz7I>|8Yt^f@d<1~n$fw-wh!>5 z7}-vV>Ks)1l$yCA!-?N0tQuwZa7PL)W?puj)9(c!D=5bmd^oPGQX($+nA1V+pxGIE|P=lPs!NGw% z4d4f!&j8Z_5KfOE7{75%hca^A}5U^-fG3GyP*o0Q5Y*SbHH939nw#dlMkcCGTy%ArNtX{ zCqa1p{ZB?w(0)9{BU=JX1}`sLz#Zra@#+39EJXZ3hzQ-I19nUgm)qqvs*`GVpd18R z1KLnH8VQiNH8nSfegrZcR03I$nF3ドルO7z+F$*sfIT5^2ueWBs|tTOS<8$)^4ux#4)k zp!CB@eGwMuHU{J|3-PHE7o=i-vtib;|aLv@g0YoxBO|8F~n7I@S*Zs^xBXDAodsLIK_P%tKrL}HE zr`EBg5R-(m!p4K;9lUjOg6!JY*dhsY@pIB57okttB5M&9XJeJ-qFXT3C)xJ)d7Nf# zv0bVzD|5ft=mm$!ELT(zpm#}r^bseHVws%xqlXUZdR5*|{d)(&7=>mElzRR7Dz*fmaR0kXCg-k(=KJJjB{uyESY{_@;8SPPFgI4Rq z)Eb+j?U#&w4uaIKP=T$~r#&As|3O5|R7NUK-NhE%j)#X|$}$5ドル>yOalUBjiZtPUm- zG(QBX22T9hhil0J=k0xdIFuK8{`0hpO4ylvvZMX`gC8iXn3GD7tLT%ikOtca3@OsdGTztGY9m!C9u910`IL362@a5}@PF%F0svIw}28Qxiy5uyJt< z8O%&g^AC9ep%4IAfK!OV0Zv;W2ZjJMPm<~ef#g_rl?dhtfj?&mz6xj?kmube5u6ig zdCF=)I1G{a#l_AJ*#Y?o1r1$LNkdId@l~)KfKbeWjUg!81{ZD*2oIJI6A!QtN`LSI zRrIhKUbKAZz__b}ico#Wjm6o{93sTS69fI|+ux&a^TUlSsG75*hDpF@BVZRciN4Cf z%>LRf;G($)Fm};lI~yB00A1((`vKsYetP@VY;$j~Esqj)z))qT*l+FjfxhWyVXmua zf52y|b~{)L^2R1B4@vBx!jNTx)T7fKW%`Y&0vS0<7k;{vjfbkrv$as!lfn8#8f8fn z1TBkPF8=)X&x=l=&LBHGYyMh)d%XvSUTpB5pU~GmN%0hhl9de`RBSzuI5_RtXic|F~qxV6S9XQf3?_FQ4N2x7vT<0hms zzD+#rJ+1X5o)1%vGM);btsTAH8{+f+`NbNnLhmx?NCoz?U`!bzkbhZxWdGUlosye^ znvR~iIR8C`kih2?ABB$wr49jK^gnN0WIUzD^<@vwd>^~W?Ui3_NgkE$o!E>3p7X#Y z+t85oBp94>DT*-p=TtO6QwJ`v%*?3L&?gY(YYhzzpxb3b&JPF=4K0A^mlyqVbbcO> z>nUA3QO;P$gQ=AI4q0Vgb_TEXG4b1e(+FAUBVMkuG+Xgbu9x$UL{cC8fQ4ihnr(kL z>=0yLfE!2{4-kUDxp>D6=LgTA37oJUF%A&E5q6_Uk?a`&3n-8^C1zkiLIkyB0wpPsQ_$be2mf{Gw;tJ2I|%d#RgOOZwY_(jhcZ~9UkdlHxj0ChbW zrenLi^YCbB%+!4PVXMbj5U@V~|(Kwf|`XeY%Vor{Jl!;P4xDXxh zu|8#daI|I8_0okh1_mmWqyPq1m(el6zCl46<`wwqp$}9`^>V%WUu0ドル>-}KhjPJ?eJ}Kb785+T@tV4eg!ap= zEWCZq)%+!0)MZ623%!r!y#@bLKfvj=d4H{}=o}o-|8r2km)rSiq*8sX1`RF#ulcT& zIQg?_Nal8K^tV>+?-J+Zvrj*^%UCuEY;b}bI z=5tH;8*Jc^4lCoQqOer`Z7TQ^;uuu4ig4+lQolUw47$hqmhwBx9>zR-8Lu6bjPx&_ z$_9zXYEXbf@pfI;QxqX;J?RJZrJrA^;*Jq(l4&ApbeqELpX+@donF>U6w>_e7A+J~ znH~>{;$QDtx_vKt;r#)}`tH=p-KpIn=G(rv~m;3=&0cXf>gv7r)V@^(!yakBj^=p$b z8p&~)?&RrSbbl=|O_0@R5(wkOXImAtwj%?=3(>f~_|vQ);fFqCOta)qTA-Jl&)EbrwXm$vu`B z5lJP*Br8u&&rF`G+fTeGI~**@5ri+c@Lbn^e{^sJdg#f2#%f$fET+)^^azpFKB~5> z8mMJl2CHortctSFtIh{l{dCwrQ*~d5D=qsTxxSivN^iD0IoTkAi$+h0G$t8kijpoj znP@_B(h$HiVnX^yk^lX;NgIEHV)&-Tz~rW=pJaVeF+bn?5m5>6(<5#hw-a8corvgy zc2ZU5i8C~{%YZ`=9A>F znN1rozBDn!I_bAxdkah5K=h$zc52zi%qG9O@z+7U^p{V{k})!-)n&og7|bNQ$z!-*fO<5hl?hyc)k8y^( zp(A{N?}7UZsRM;j@X!ldC^QON)k1bbF}S3k$Su$z325@Xgw-Jb8e9g9an|SI1sR!{ ze_^TQ3L+M9Qc*$U(w?3L7a%fX{lKt>`R=ztd3q^v8W0q!A=wudq!a*$L5=G5zVaQD z9yXtj0_d56U#={1yeOolwRN9!VB8SmS_DrLgh6?5eXJ@$UgF~DbO3OaN$p4+_@yQ` zL-h(>7z)#|314tAsf27yEKwqT3^|I=kN!%Y5_7)qox3^~fNqYJiI081)W#3&L~t0j ze4Z99{NKPPhkeGyhCX&RA-i++Efo2h*xA4p$Z?n>aPQn`K_x?-m*TQ`I- z;yw_}HcR~Cps9S&1nygw2tmQYAZd?=Ml^+0_}|z?fHGi@PD~TJ)c}~&n!Isn_QL>C zM0Jb96ドルKuKR0_(W8q(|vs;ld*mACayyInhs7+>LdCs5T^hv`eEw&SQ zs5Yn8t|X0MMGUjX{kA%Hl(P-ush=6S+b|M&Aydj(h5zoJ@#&DJ_NYlo5@Pnd zI|mw~J1IW1gY6&raik}wMcVdz``PJLXqFn~g=Py0FXf?)jH|wB9g=^YR*St}@E^IF z-K`E!)>`~O`KhJ+=(_5$)V11;R1tapv1N#hT_@UD5)d1ozvzEAR)+ z-qL9&t(jr$mkd@mm(sr9YnG&g2xSsJRkRA?Fk6vJ5-KpxLIKS^A9@&~2#(N3h*Z(Z zkzj5wFClgM?0LOz=w>-IG&BO}mxUbRB)X8lnU_km)k&C+5y9;JzQKm=ikw} zsywQU+1WX2@R*obm#YO;>h5VSW-SjncmbAt52+sLzn#?@rc8^_MFYo2Mxde~6jTw= zj*cA`J3Mc%zQGad9b$ZC4&C+rhFXudn8Qe?v2I&jmt+w6M=z?HdJrlr!gFE!NpSHa zy8b@xF;y&+1-4SS330dQ)*GgZfV_ojc%v3lG6Cf7>bgjsw(;jI})5GADxS( z&ZTruciz7fi?>U%H^`i`-?2o<+9~v%kF|0e~bG*CT`dUJ1riTn1{ z@KuXjse+)j_nF&0M4GS4+BRC{?sr9P?^?OX{i#6rgfPJ#kuhpIQ)R@*kLzJY-*UR5 zj&SoJsz~IGBseJk-lq>vrHnxYOH{5(gnpG7p)D&&f6* z%qTK2*PCBTZ?+s)7u-jTJo-gnP?4NCZRhqfse1=U$^%}f;%q%N7pu6Wz1=*r<9 z*cmj4j>*(Z&sV6r2XGLg8=IT zDzO6JGP=~s)sPez93vb6xZuv5Bq@QqhWKU?tqr#_aO7Fsqi7F{|HW(%N%<~t{~beog}fn~jln+j zaQ~NS4>&V;Ydr*LsH~?dLIH)!=wy!gjAfsTvTmkFQ$%v~HrOQuYzR?a<9c%@ol#sx zu`03ドルPjYs>T#a_W-qyjR5sNwp%d@ngcU%csL>+~QU2L(OW2aA2x}@bkuXiT}Nj{a^0%{R6LqV^@WF`v<4( zJ)Cia3^-{9GT*DTnq}>bPsiA)GMUQUlTDrCYyjZ;R9!K6{!- zx#%a+HilQNC|t_C{`xhzmI$RlBvjrMjf$|J6H-q9o|M-t1U+EaJqEM4Vgl zmzXm)VDLalJ0l577uY#Cgp)?fhj0jf_yBhSDCB}9S=c5FuXrNYupa&IM1#tkN3tq! z3si)k_=qDq)T+CTXZvvbzqxj>-@)4!h668#A2*Nto78eo6g*iE~7@+hF@DD)P zRn`Z)zWE;a$-jR?(I7*ijoz_RW=TBR40JnESiu1u$Fghc#4VuvLc2)(>wOy?8j=N0 z%)po0a3JJ_BKd&_fR+Ga3FqLI{ZTAq;w4UV)4i*r620WyIDl?ONR22(MhDdcKvl6- z1QZm>uk3)GG&i^Q(`37mwOf6$V8_}Dp6;lk9G&=N#I}x}CxuRIkUpKv9UJA9 zUB91=1QzBd3HC~=x7Luq@~A4cK%G_lczE>j_DCTbwHTYSBt z*1&4iwK6^Z*});+UH>5dKa-)H)tL5hC-1Op9nyk8ea!s94#N)|bvAS@B?6s|!nHL# zMK*M0-n=c&Z0*2jp^LfIhONw-uFjdQtd)_ug;!F;LS|l6c~BIWWpjZ$J+{mR&2;|9 zdv3R4%uV7jY@0P1uAKX$XA}{UR_j#U*E><(^y_rl z#4hqRie+IK3D9PkyJWm#^B0iN#tIP3QPI&>SV*Y&G-?2HQB(xH4`YVE8>@&E8^047 zWmrNUAP(>;EX4cRR1(CHxRhF9Ag7oo^wm=yEG`!}uy#&SzZ*=(1fJFN0BYk@buT)+ z>9pLo_`;_HIFn2+PI4bHFPTF^i1Zgxzw(z!Bh_faHP}Muu>_Ov^AGHzVwPO-L&C`- zvb$w@*il3y@Cnclkf_ije>XtD=S%^+Zova@MNgyYT0S8q@*gkTshcpTb7}vLZW{@4j+O5;(I*JQcoKB!9 zcZx@OkLoe-y##XGeCVxYaR=D)8I>oYi~vz05uRq;VnX-=nKl4D(q_-~a6Nl|680i;ICnxbZTj~Jh<&dlr3?(b*xhzz7a$vj_t7+%2utrj6+lie z5*NraA;Tx@^F1LI(12irZV5Fnqj@LPt0 zjfV%1f%)jqFo=DS;q6ZcFY^-Jy?g}9)Wg_91fw>t7Z2)v~kFB|P z+G{NS+k{qy5hiIGo(=c(7n5~1+s+c@0?NiX=F z0h+meY{Ygr(J2;b&J zZL#a?byQudZ>!58u*kb-U?jrF2SH$f=K;uO56{mUwAh}Wp1?{QXiH|>F*OSXOz*8L zKTcXxd5K8^AuY79(b)a(TyZY|2D?qPjSJE0d0~M+v?g9wNRW|=RWBYD_yh!y_lkE+ zYKlRMF-7ドルVqP2I585wH>rDs?)d(Swc<@xv7phd0ytmg->AhhR?c(TXHxqr#&2@HCm z_D8^^CzxcjU-=2tNS-|u)&0MJ|Gv6%I>JF4ドルN0|myxM)fJ8k;@T@c)iYirMhalV}{ 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ドル(t!tpEud9pybT76A>stnSP+wL?D=7H#@^~$a4&oQ`guL(kW;UO5o{`Wm zgv81F+(~xcQ4RTlf)P@Y09harGX{WFC#S~3LdwT37Z6j8SjeUd1%t4_3quLQ#J_`N z_08jB#<6psgwvc|6i)qV| z@Ix?w+zsfaKsyP@;Ju;xMcnlr9g1g*M*8~1WMuw;p#$%9zvfKX7bVsMj~0l~0>>t{ z-sZ~q{{4>7E5XUFn4j$P-LeCCL_k8r7tcW5JXZYYq)!+ys?5#dT+)G45-_JNu(!2c zVbFg7Wh^xn*LDil7HC325iGLG7XTOY73cvEU~LT){oq!Ct20)QfPMi9okhXI`8Vc|u24T3|@H(oW zK6#s%1RfvMK)>AF9BN!;BEU%d;Zn24k)NlELoUzGYPulFIfB$wef^cY(`C@Jfwu>G z6fviZfUX`=ZH$)yrcEUH&vc?007?OupY!AE@nOC2_g$aR`i^#L#K3PDh<9`bdy76l z)#Tb*SL3_3x|&t!oFnDzlCo1vkhF*4gAfY80Y zyt?iS;H(07&?(e;U_^w4|AV~u0MW4#2n)s-ksWNeM|QLAqPI1?fiV?(XjHZjeS=y1TojyBn02&NJM5-|Mq}s<7r9UAs-Op^2y|9T;w~`?~F9rn#f!uL66L{_X3H-EuC_UX9u@Y=_bbIjPcXxN|>R7>m zb$(tM@S^e~^;olJDnGS>-VWUF+s_bs1Y*huJ3CPBLRoK@|4nCs!F$TPNVs63&e*>| zfr-Q94ドルj1QF)^E!2BagRCPFXhdr)r>p9o#P_3tCu{5!!vi14PJosF&C<&0ooldfvh zw$u~zNj{b(GzX7>Kr}bzi#V8wfx2abMBpbJCxEiX?P%^m!=FWZ&Y*_cj&8y{qnZP^ z8)>T^G5wt`Rbb*sLro2+K|mQ;@21o3?>=B41Ens|T??Q9G7XV1+z31p68Q|(T_I2h z_aHQZPDo8Pljt28q2cBIr;D%qx#|aKGQbxnd7J777f09gqq+G5%Mr-_fFI}J;1GA< z_gBDP90_oTWA6%!ib&x>oip&x!pe$|iwnNzjSJY3bP&eadVG03jL<~t0xe>T=e@kE ztEsE7DggQ^5ec5?)2@@_=6b^5T~t8hRexBDiZ!iuSBa0RtZb~QL67&aC6*V`gL&Eq zZ%G*vD>!8>wyf>ergTHomrKBMZ*Pw%9x0ドルmei&jUw19&Af9jsa6PIhh!x zzlVWeQ=O!qB)z|&-ZC`40Gs-QhXngak1+2=LH`{69|%wZ?ZC=T^>Fiw&+QT#dg7$q zSH@o;Py;>%>*8WSk!n@*RkF(;mpU;fCI(a_#ymB+tP<)tn`}&af}-m5(9sor%$k}r1j|cm;daxdN0O0O+@kT7&oP2sq0_{MW-K!W1gL+?Ns-%QD)Cww0=nW7qCntSf ztIB`=6zG66H#C;U(2ZP$Q{<3J_bEMh3f@hilNSArQ?8ro|>;6 z=qIXNs?){qnQdC#xPmfJI^@rxi%1XItjqY%p7 z+%!_t(rzvHy2E6^FskzeNR&pmO2~qdE$@ zsj_E$ie0<^v3uydl*s$;&&0&eimcnujxx;sbtzk-ovxvgxg+jxbwy1^fu0f(i?kvo zXkBm1ijJh5h`6c_KN7V#Nm5;|6hgQ9=eJqn_wW7Ng_V^ksn3tkw)bb)kZ9I?o4vk4 zZ6F7IKFOe#^A(PDBXr=~g12Tvq)XdOYyXi7EBlF1PhU{b*xbCNs0au_gA*4xR#sYy z$h8NGJ2)0QWS_Tw@1VY;+IQdX_jfXyk_cb2^73kGXjmXErb&+@gOBV4vdjdM;LjRY z9==w2RCuj^I4!oi5!e3U=?FF<;fzr$ef;op`l)12y|?tvi|b1cq@+>gj12Vomtf%v zss>^>;U;pwW}NH`p#F7hK-{?}Adcp6+SdooJOo0MkB<+cl}jvv?d@@#b(=iykcdp4 z*WPEYgS{T)ZK(XNSZ+Qb7XJ!OikiApyzP@d>vOC$rHvLmIsTCSJBN*g zT!X?yHKY>5RH`A%hLk44tHz2-?`Y|U1+KWUAa6VTssQMw-rU@P;wYAq#`cj;m*rpP zfc}gENWsCu!Juhd<%y1qci5a2-uib!phofc?`g1f0h62dygyd=gx*6&poj%cvdgva z-~#XwEaeA-9jjZ4<%pthhl@a&-w(h5ha{)+>18X}<9+gznzgryduzj28oy%lbfz<8 zJ&pzpofc1UjYkJJpvVI0>B+6M6s^-J%b8F9-fi@gbiFLL_|fo zxwwd38mp>oU0i@E`an<6er;iulg3--nb{^c``iw!(#+v8_z>oZ^8_+Gh%}%aVL{B? z@`%bqNfSL)5X20fY^C}!zdk(MB|bhPsMwtP?iDbM7Kf-$zp=a=el*tKF9K$e_xixM1i%=do_L$Njvq;gzuE&}qwDhE;M?xD zw+VE_Jx51o!EiETY_OuGZwJj`#rm0*X&JswPboNWO^3zWR?h#*jc=9sRZ*DPZd9B~ zY>9ドルlQ96p1OzwES(T;g&zkkd``rauU&)H6*k+0o~+hdg0g2j5>?v$X(gR<}wdql$s zOI_w9X!xi*>+}3&I5u$sCiVD95c>@*r5vI2ZH@IA_4uzCe{Cfh*dV_+bBbUk7`qR8 zDhnpsZH}@;J&kX`_x$uJuArz0)IVFj6X1(7_zf!tADVa$_Vsb{@Bm_luU{-%a$@4U zckjR&wDVaSZJ0J0ドルWhrq#1AM@{pfA{*tPF37bse2&KI!P-n-W>gQXj&PT~^O05f`N$qyrrI-Un+W4ZDR<6-5}mkch1fdnluw~pqq!`}ng zzl-|lj-FpHxfOmSmJ&IoomCMGLfr0%ztd*&-g}PG&BggXHyv4s8 zSzi)R+tYV2i7wB}%F2n)*yiGpn`y{;@~`cl=}Hb&JEc)b(V0E3Xw@9tsr){~cxw z6}!54b8Tl;9nDKmKMROZFd#zJ`=J1FlpvsdcK&O<9ep1#rz?omuj<`E&p*-l|3O@m70(9Ba)AAsoc##$~ zWM$lRtlnr#E+5isAV`vqmCYiIkl?Mb=qGq~F5biyCoR7St?+q{d)laTwc@!yr2hFp z!|r7G0IfPqo#kXZ)#8~zICEzZra`du8tKq`EajL zG;w@;$&$ofztF988-8pDv&T|BoCR*kO{Z0PIb&Wi>B(=ipT!RK6>P)v5~H*7{Y$+9 z+DDNwoz3CPLB~BjCcp6O9HtxWCKFY-wd66E>O{qbziNENa)0Te_JiAi1YP81*E>#D z*8I{^fKL}7lG%wiQGQq(;QJurtahOq5xDC&YF!oj>IwsZ6G}qWhpXN14SVJ5MSZ%wG zqQ}_EsbS*go*M5`{57P>#Ly3Qav7k8sjA^=eR1M|EsG0ドルhxIT23?e?eV+eh zKLL2-%Tx?eWth)Hky1cAlZyO`HIl-F}1q)aI#8ML|aZ?S1uaf%#b z(`n)@(wH=Oq(n+GagIu42v^q724OWmKT>l?ipTu%=428f&|C#D>2skZGE37PEmV4(EL~ae|LD#FATlbP*AW3I2lI(%GSM+|VL^%2nHi|qsy(%-n~T!C zuAjJM4f|0BdnGYRE$aHG&Mmmu(OtNbE%7?|wowq_zb$mwHhyl(B@U#GDx()`4mQMa z4H;a*Qd(DM(jLvKJg{K@nw0#EbO@_;URnZcTIoPO{C1NljqlI%E>kCa-zT0 zTz@2A2zDlK2npe~CmJnp`r05#Iu$$@NQF}&BcD9F+0gPFonFfcZ z4`>vRCR_a&XVkHOz>Mq)9RHM$V5X7RBlz9eB%9Cu>R_;rH#dlZ*W)R4njhUNtefSA z!Aj`eB70yZY-p!w0EP~m%`C+heePE-CH%Q{fH zb{AJx{)roPzCL!ocB6QM={eD={;RfsegJT}1R%bl9ドルlF|%HZIvvGLED*&f^+l*{pu zXf>nBn0s{OAMs9!c_;G6_`|=|80cc(X;}MVzZ(pWpS$=JRTI^JY3R)UnORWn+10vP zV_hqhwp~k1+ngwVRp}-^27RT9zPV;On3S`Rjbd*5YAFwNVc=Yv!3p27cRl^t8i&Y^ zeY`ybW9FwrG5&w5xXt&+TCgsW(3Wq=@H5iW|NQw=TUR9>9Xrr=_t_vYlC7e$_M_9U%(WvlaqOw<7mt3myrcg`ycjy8}=?@qpfucrtn zH@}L4{uJgR?3GV~D`XLLBJBCnTsb2Hbd;PK>qeGM!{d1fgZjh>_oToc6y0ff}$W z4gKm$xRo9t5SSi`ebtz_d-4OoBL2e>xpTgFi>rCU1OM(9koN;~#cF-jrt^ZXf*>cT zic+xD+0Mv6yH=@0+QhR$mS z{p&ET?TE$FxwFp=Sj-%QDAy_IeP7B!@_OOp4d4qmPft&v5WBdr+bU1CK?W(F*|xwR zrrH?~5APAk%r-s*x2$($b+F}s$Le?~U`J2-81UWv1=7u|)ndsO_|mM+kdu?MadL(p z$J*wc;~#N%71X!2MLG$A;i9Z;bbQ&drQEHj&Y8dJqLFCtH*_Qo#;IVd;l?e(9+jFH zBU*BTp1S^9x^EMWTbyKjkLBYsB0+T+ZPM)ewIfZ{L^?M;_c6deFM{zifbM)xoDG{X zkp(`eH*9-P_YSJ~G&D5k78Yu18ZfZypj!uGRe+k*vxNP>bJT};!Kba-aC>v}@^rwT zo#J_ZwRBm_|920b-t)P1xlKCDst>+;>Bk2hMy!&eKe(a7hP8E9hr1HRp!EaI1|9y( z6P8YM73Kx~v$K#PEKW7p@Aa3e02AT;7Vd)MCau*wVyW+P$QbB_;O6GUh+O zGfsY|_&EwLe@oH2pmQcEE>B`sT47rWgW@@C*o?g#ZouyEx(@K=DHi2fDK=;|RpCva zI|;WmKGL3CnG&TCQe%8R`13|MbPv*P+y=}A zdXi`r%IR57tZMPCW|Qgh>*^XSro|i3hTlb!FNbFS2zy#IO)8zny|l-@yj+$HKguEI zG!Je_%|W8lgXvYiS*NF!4J9nCY~A^-9+xJFzqp=k`=}iGiX>l%qG=WZ*Df`eTV%%p zMFoE@hXkKxWfwsCU&Pg^Lr4ドルmdx z&hzp)fYRLFq97oIgE8OOSlQ2?hsVc#55DXLbIb5tBhW@`atFaD+#bsjm2PKWJL4{*LaJQ zF&IN=AZuxDEh{UV-05jnQ>@ogAVD`?#w@iorgCZ7gj><=d&%gio|l4wv?5+!#qojn zgq<8u`j7pcum*~a86>CF4=BI?d`%)iSH!{Nlh@)>b!+5h$^rHl^i-%f-#XSW4<;}n z2XKl@3g5!WuyKHoyP6tjIu5_-&r(?_38Z&z>4~4F7ANDsD`aM+VPYZh8`QJi{;?QE z-`Sd1)EXaOogE(|>*{{-*0PfDv^4*!E2Vwf4jkWCGs1WC+lE3L{K1;JpRqb-JU+2f zmt|@32Q_2Sj~`XQ(5>@6z4QJ^&Ii!PfWTGu!?Hk2c6z#oyu3e~K9D^D75j8IFlVy~ z929A10xeN$m!gPwKLCLAKfN%%UNZLP@gc@g083#*f2IAyu=7%~5%pyBYu-JQJd+Ym zcG_0J-VFI`$xehGX|jJx$lJtEOB?Zo{pKk8{F~0(cW5BTfXFhe)55B)!m{+0W9}=z zh?SXHSyA9LDtWEeU@()a5!A#v|5s&oRLm_)%UwgmLu=y_*DX(Faa(6qacyB$CCT`f zvAN^P*oq#{XA4QFy#i(RG z%4MtPxg^|9+zCW^rCdlc<)ekfxo~d=stf|ccpis`v2g|oTcQSmCp}{voFs@ zC?A_#uT1R>o0goEY#eGcVu|=*?vux^9K?{uD)`*%uh_~A5dmH?i-S?oh!B4 za}96EiD_4Gv1mP)Ty;IVxWI;x`v|VS<9+w@kxfd6@3ja}j-b z)*ju^7?hfqRZ&^srr}(8dH+}T;XxMm!CEx1(ehrLl`ckXr= zH>BcWjwH;w71X|)Q_*p9c1A`) ziD`q4h1{kyz=eSMH8Eiz>Gp6%{Ta9CHut{|ez9{KxG??`W&7?D@vM1iHL|jk)E~O$ zAR_3;TE=M5HB0w&%=HOQp7Iw5>tYpOL7s)F6!Up{hq`0~H z2%1pJN=!!5N&WKjtSQ;)*sd$RlLA{;X5+NqSs<+gitw#kltl@kpllw=mn(=ncxrlm zG}%8LChZI|+dMQDP-OGD{-B|t>7N+X)?n%BKf3B@Cl$FT-y$A4_(k#P{%1&>qk!ya zc$m!9EjkH<#8t(mpettyl&%fqcmvk^&opck#7o^l#wg$a>BRUAE4w|*qzlKS%lwR) zgiMFyZdG1%LqJ1vX-7rm?1iq!N^&Aum2p`}x?h`SO2W=pJ?-B}I?W1{m6<#tmww`g zA2~Hs7=L4!*rr5R{$^XzO+vD;Rkjq3K$vCF0ywxyuyz5s*M)`e$;nwMDMU*vg}$qr zv|l&>H4W+TnytH|w5WRKG$Mg(UiCXOeD7!4cV^nJ8cZ@6W+X)!X%e*LMG&@^*{lxf z^A1?+wslrd!J(i+tLqk?Zo2ドル@v{h}O#ecgrZ1WbJ! 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ドルT7hsjh$JYk?ret1Q z1~A`Z^RblvaS=QQJM{fsYhBZlvU17;uU<_dmbko#qtew8s&3d9oxy{t#jkm_ipu|h zUC<9~8s|gb}yo{SQl<@gp;yvtg)oeow z-JHWonc>ZG_~gt>B~XQee&0(XrqS%>(UyqGaJHOkViLt%f`M{eYU?0d|LLN+@Td22 zReGCrWX?L_>lx#g%xhxebphh={y>#WQo__{yN_01Dyw_|q|*N;%z)loo57y>lY>ek zPy2}!r`hG-zMHECM(dJdD*V-KBdb&k3n#mS8w`i{$H|;agE+snd0dGU#b2ドルPZz*jFduXON}ij-G9#8(GB}8V4>;(~oZ=(5GeaIOq+koI5CJT}KZ% zsknWZaWGLov@;0g=RCGcFr7R;5OESiNAnirH$*rXnwqk+x0m1SaUuNonw8({A%p^W zMNKs+um@41JHAxM9d^GfwvcIgZ(ihj5}7t{#9}d5=D(7JRDJq67-7WZoebuvMV=H5 zX$Ifbb>!|ZE#9Byj2h~gdZxKQ3tZ-=lqhMs%YV?#u0FKnj;PV{T!#m%zVajwfAGGx zlF(yf7*6%(67j2=Wr~docd4`t{d>uw^py)yWipSQYPF+;NmgIi0;a9v>%if!1sz1; zCSp*F3WcP#t)_YLs`pKg(4GfrC0STiRN1&hb|62^HgRb!c8qU7E%g%mI65uJUgw46 zce}A;y*}!AyPs@&N9BdgArp!-&wpQO<(xlcuir}^qz}xuxhyk62*^uhx`zfh%i4k` zzq!JGJzMxyGu`l=k>+^ieR(B)r;CbTIXN0ドルR={(ZKW zKWEa-S-YLg@a|YKte4wOq?aue^$mldeTJ0~lBvnZW<+hdm>#a2<}w?{uyw12luzs-cm&=plyacebbrwiu>DtL!W zvIcMnV;CiAx!_YBRMQYt(r@jiZ8zw%nl{wi7e5j}yi_~{y z-E;Oiq4T0vJyCCHwu`ELw(-6|)PZUK>NLkIrLfprIKPyosE6nHtnT08Twkk|Q-5!T zS)i&#e_WW3gR!DIaAcOWqS4*aJx)C=u%M$xEGd>ZJ=HM#3!x%yHB-ux{%`r%Z!LVi zk0m+3OQ}NUOEZp9C8C3d=`jm*os#tN5Lwdy-u3o6j7 zi;)h0ZJeHpMi}cSkhLF+vLlMLqe~NKoeX+4<$hbavt#tj9zcpdf!w@nx6@(@zfo&} zPvQy4++t!O&CPBqD&J!JyQa=9aW#*_ zP-Oxlg#3cSros#)9@Nhx*VHLj+B=`mcpY}!O{&Qq;P$$+4#Q{%jQi=!DMNlF-$;}Q zkC#_y%>^!IEynt)@Yb#rxKK~z?hAY6JjDtLzpXIWzxEZ!{n#R)QIYc{&%V{ULMU)! zN;3t3i}LaUEHps402^{^3RmH~yo`7}OeA6wvv=jD?{W;4xD*u&6KAcBNDb?elvIss z?dixPFp7Y-%vFw3X$*=mx-EX10_lI5@}0uwN(V8&RiY%V1wRE(gx~sq=!4X z&R*87g98;+RZe#Hfv2-*2$xWP#q+T9?H8~5oB3C3s(#?m)U_PQD zVKeD+E1B4kw>msN2#2oS--9>20GzUXNZTy_;s^hmeK4TC+=-Ju^faHhsj61;DBGT7+T87?nzl`-fI=Aux{JcKgYp;e{~C}6u^9NdU~2t zHlxXQ%O6P3R91p@AK(}8P4|I~T5~hkdoPD)!W^P3N;SCfezWhLxGTfsuM^hw5L} z$oOLQ!C>_F)^lme>BJvxGQKXvMQPY0tLd1gb7y(g2UU;VFn%D(NKJLSIsWj9E+Ws# z$!V&qJGrz(%^Pr)8T8-jP2pZ^(kyi1>|JeOEv@prz2%*;CqG{G7S4H+XL^*GHqWL% zLT6=z4;BG|HdsRqw}WO8NU8(TPyh-5F1o;m4s8Fy^bFumdwZc+WOa3k;A+61&Q2e| zhG{D~>6Q4H+Ngz2(pF{SQc&z&pZcXfmAKs~jGB7V-8r>$luvn@SQD&Cf}Aj_)v7g1 zzlG6XLME@0FzS}H$rjyNwbSX!wr*>^dzoY8A2d=^RtDtvMl6ul(pNUZFNhXOVSDP%KJN}StnO;w~P`UP_K)65{ufs^Y`QQdW8!*?HI?>`o z6uqPZ-cekEjR4@vd};*%`FIhqL*@mU58FL6 zsUPbn0^y{tS!t2#OCue@r!TkF-G$Wsr9yZV(`yemS)XraUfp}KMpid5>t=ZBuM5ZG zs?_pwN@(O6uBn92OV|W#C~8+&?_PM)$BK!1OK8uS|HY1c%ho3Z7jc4JhI;Z=bQoAq z00XM`!gq7~gjcoHBz~2k^;cK&w-4owhDu!2hKYHH-~ zs?YHQ|9hAQOw{)ix%LuyD#bsPj+s*JnX|-AO4`FY{20pG>7&-D@ve_wcG?aWzRE3s zKjB@!7tS{kzg)xHNw*oPA9BL;St}ckOV>4SlM5;Si>$OX7=eTE$j!q8-T)BxUIRK1 z!^6}>L_~lK4_pEO5)Pa)Yis1d@L=1a`G;{>2u215|K=f*YpOnh{DXc_~Kcrtjm9gtS#+mk(7a)K!Ng`!9#_6h8 zViPY}EvU(t49kt0^}Mh)jJ>uzsFHpp{y>vb&ly))(TRe)j~9ドルQ4_LJ`HHD+h&Cd@c ziw5Ko07VA3AAB414i@*XX)w^y14;LI&to{AL*Q;-B zSNHOmZsMsl4faO4{-zowG!v#cf=zK;4RAJ=wBz$>#D|z(Fm|P8!Mia=!NhZ}u zl)59qTK(L%{q##lkUNd_G;g%KBD40w@v9C|l{JKW8>!`!uX)_AcDnD)8#YCUSEFl1e0wX=i7Tc{JF+#68n~l$a zo=q10L)sS5A;^BBDPZ1b(?Bdd-aQuHuwGXH8UqRwq! zIAA4t4iAAQO7@5BAYDM-l-Q^yT~jw+Uf_E_jJ&bsVww_r>9r+)B*Y5J3e;d&AoFOX zMXhs}r3XB_r<8koib0*#bjwn-(3)v+gj?ufe8}r>_toWL4d3$wM2Z?w+Z^!B@sYqm zPRx;zle4h|fF{uw-@kmnbWCxXCdS8!b4ドルsva5TMLCr(E@U(Xh62N8{aVUK812%*?`I#-*ZQ+SvX* z4PEbkGYbo;3Gvsdm{%?$X)d~NEOZj2bYY!)h+vF;T;PqfCuPN%?3rG_tp2B~{>iq1 z1U^jV^|CYuK>YwY9jM?8DfZycaKPJji1~SzhkM#NJ7c*K8#i8FUgqbM>FDTyzsSYa z40JdEJc<-wh&|y}`^pr}3fnb!rwuf|iwdm6gjpltf9i=hpfwjsvpw12#pc@GooYaB5>u4H*S%bW_-AOq>Mpr%f3>9^{mK*E`)~H#V{eY!tJc8swxg19-=vjGG9gxPfw#Wh?tqt)eHcg4wNC_ zUi`KFSn+54jUePBK*3*MUxRB}P*?~&&V4;)YgL^%5a$ZJz1!xTePQ!|zgBvs&qnWxZ15X-iWdO1$B za82vKTSi80X=5`uNo>;Y^~jFP#=e zIDkO&>x!M&!YC>zP*PSV!SCz21q@2Od%su+S$$#Q!0hae+m6fk0{>puHrKNYEFB79 z1Xmx@Qc-mY$FQ{m^_}F{`FYh=4K?pBfm4 zn=Xi;HF0!Q1h4jPVT|WLS*EFQ*dISam@H@r2LTZ=j@2`0Z`JY@vi`dWp|@?WBT?{>SOG|6?XonU?d(xEr4n^G_X(7*kkNw;%M(nj$)p> z>sDw)(hM}@=0fg7P7&bXbRh&+5y{T$H2C&z0ce>m)dd}*>pzNN!WRl^Pu{K|5N$w9 zeK$sQ)IHL!^#_BWC)}^4Pd%gJ9O&4QkZEugBe<$z;dv7ixy4sy( zxE8({eoH6|F>6Ln-V3NXNL+9C zScz1&<(-en?4ud8n)fda*)uvku3geqe};`a9+mlcv49i{!_ny3oe_8#*so(nu&a}q zM2`VPoRF{2`bfyv!jVOCOR$Ig>X(tX!9)Kxo_G-H$VXC&Z?ID&7bl)pH?JSOg)+{{ z9|V)y{GoQijuaaoABh{95r9m=1qBd8T@WL%!$?2KTVlhsLBwwLn|#2gmmM+Isyp8~ zKK_V?R^67yen+%>b+^?!h=@p4752WYR=m>%1{*&4Ym;^1z#!rHM1a=${m9Ues-}!b zQ%N!bKR^%;Y=@PMD^C6D&`RPpxdn*m+iunnf{+9Q-z?U{d64XQN zgSKz@grpA3!{W`h6%+1Pr z}NS5&DUV3GKLt^}+vFdzaAp8~yb3)Z*d_QK8t9@bIjPiuF@4z;$H)&R4LYsoM%* z-hh7*2l%dhF=?5O)_s;B2}Ztm^eP*`H_YHDiij+?}ZrS}Qa0sPh1 zmmZd#&41x2P^=;<6$yha_q6kzjpy@cs9%kub^1s*3k*} zEP8ドル^z{5cC%`xI5T8%j3(7Ux}esP;>j4>)h%?F{_~`6q2GNWfyqcq`wbAH)YQa`tTz`I zUphkjK-7dxK)Vzl3m6gs4prShQW~6tHA=G$b}YZ08ecKq}+K%o`hh~ltoqULdqZR0 zrVqO&EG$t-NVlS5)jT5nMp>w^B7rVv{>HI>^$m5t_X19;B46M^GuH(Vd|@@j`K6>J zDNZ-UmfwQfv6tlCTYa`*N4txQow%(nKpKB&X&DZK50nvEoDFQ~$ayuCid%i+oo4G> zomq==J&lQuZ&hG6{b7#G`#jDuB!j(w5SQY=hK33KOhZG3lk;lcDDF`hYU@p4e2BJ8 zLJF#wV3A%}6%R->pm(DECF3|uJdP~dQU1a(uH&%^98f8H!zkc*wA}1a1k{w!2La_7 zm2#gGC-xxU_8GyIrOQl^JCs*@TTTtbkDk$BZhB?rZ(xTK6j_KOiUKbVjGLaZF~t!4 z?pyt#@o^CXSW)3qIOnh*XrfSxA;G{ZrP_pzY{QFb47^ z65l{h8JJ$Ylv;_4i@U1gv<#yxfby;g$i;d+bc8f&g2*fa$pnc6at2x%&wkvb9tsr2 z-!kd=!hm`Xj7LCE7RL-sg$#1P5Ww^8vq}3%U3IdAzOAr;sC@g*3`{=*0-)k?tnr^c zR!ARgC}OavzPij_-83}T6MrH5pbcbZ;p{J_NXe|geXpIFA;R2^My##%;^PCiQ0}N` zJ=THpf#LZ`p$cP~aW`b_Z15-KA6{)90ドルFXRwF1@aD}QvD7IbglofU2{AJmNyOw^dm{I+Sj{D)SnMaEtMg=0{&ya0n6)~Nq$>)hj+-v2o6GP89SlQF}X z*&*jpteZ=;4Grmniik6pdjxvI9ms`cv@w~tf#NRPWHeBHO~)^5&X?n5Qw33*Ho>~*E}1{uWk6eU(wyg&$KvLbkpkVI zog402?%?FIQ65{i*ko;v&PtlmSEJ*(Z&yKWHrR3}a&^_Mv&q#u0O{k#_y1_nzVa~I8! zdHmwF@d`Wauaq#8)W4K1AE}2?twfcPmxC%ZB;5(^Q(Vn;)Q@eY9D|hbW=XAmne>xX z(OV0T_gW!c9}bHPtEjxDgozcl==UNHcFuiGTgIy|iV(NAPNUrkyHinR*qy4_di)-G+uxIck+<*{!4 z?b|`Y!4GnK`THO6T=eTccI6okqlb8>o6O~(&y9*yk(g3w)jD$)k9VqC-w-zI=_|+3 zgPi(XArM9isEDLN1&6HrafMgn>zGapDu z2?@N<7b9=kp}8d;l~f&;t+zw0c~vrt8w=2c?fz}??d{4}+uu;a7l5&qgoswce2?un z`7^4sQBf$J8rsF{KmRh) zpK}qM*QTez$#Ze+>re;^Kgpz^{s;*{;MZYn?QF3k33!27K=w2$J$j+LCm`{P^#*d^ zd_`f-Hw}r&&@Mkez24gg3(5=20ドルQnpZ_aJX;3P4W4rN+ql(G|fEdyxMq!PK~Q0bR| zn}$a@N7l?*{)hDICe7&fN#M<-Dsjo11kU$ z$<(^yn0fh~ba?onj!qkn5_s2`1`ubzc#h+=`-n}i#8=cv!8h|@e5gdb;vod{juxae zu*rAt*fNdgcRj!<0hl=|ea-+s)n{fkabxkbm(r0wai9-@o1ldm&|h+ajxsxpcvihk z8}~2Iy;l~T4Xip1$drIdbN;@cl+)dYNn;88+6Ue2Hde7ip08C=!`IX#J))=8N7Z)x z#!Izbg_hhmGgDgh=BO&enof57v7-6f^2Ns1VE^E7`Zd3;2r`aD6X~fIKC+G?OdRaZ z@{t-75p-zt0eo*XED#F4_w5@37GEyWuIBK)pooZ^Q}&_By|*r5w|z=^HMSAEz5fWT zrc<^-{z#ylswd@lhlsd4qkk{bxt$fhnfoq*{wscK6FHvnjH4F|2A7@~-o zr|dgtTccxRjeWrzh0R{&L;Zb%AB*@NBw0P|r-9<00|mif!*xo-{tiem#u&*rptkaj zPk#O!0T~3Ou=jL^6rTEaDuse*fI|SZL(+bM#%z=SJP`4GaBU_F)qqtA z`Z@F{+_t>YU7{CIw}ipo!Z#PiG1VVWOB;C^k6w0fQ;h~4GYK)Y2n&56-a#`D_FZtN zAfSWOmrfr{gu_2eot;P(CX)&5sfp>!759Pt`FT`G_jR!aARLuS6%`NEZ|Hdf^TB=~ zfq_ip<#om)2bji2a}lt-8^ku+hz9dtsqcthjr9g~x+jck8n}ihzu8!>`4I%COm%WY zUW$dAE4sq_V`=2y9c?pPu$2ドルiaAy?@otaGIvX;}cp-?{Q^gVyBJ|J;ac9)tV%@X=Z zGW4#YaayFsBB&5B#mQsFC;ggKP)kdhBK^2n)wNlPuIu?r&xs2}^gzj0Ah{h4V>{J7 z+8{SI#c1R4-S-uzg0^NzTbWd+&9xd#$w({;JBd#FwZq;o;#C%RQ8OjE8r| z5%_y_;VkgUn(j?fJUq~ZoRs(zNByNle~s(t%Iy_|)iP3OmX(K9-OlT4kgvFS1EZJc zWtm%^iU9$)NbWO*)KSu2FnQxi@R89Abo*%Zz-`tQJ62jNhIPqNX!~fkQXa2t|EPJk zTsJ>6Iom;lyfk^N^zG4MJP96Nz@FeN4IbXA>_(RfC~tk?HPkenPp9vr!Hlh_en5wQ zUXc4<%cqz66l2=qyu#vu?cruu|jp@hecnfyrro$amzipenv?vyqqq^->?faH;=Sfo zw%7WQc^&ck@au=`YK9lmV@h_8Hrs6-t)50ドルZyx(Jd!|pnivN1`n)ZH(SB+Pi+D4#d zy;|B%7yor;#KAU;`8S&v-@mng^J!Y`*j?RXnvNBB7VF>t;{NppskTu`D{X2fp|x4} z2u-}cBUuuCl}jb7@Rb%P9$?_v!O6C}3{HdZVKX{}=l5`SXd*EmQJ@$f^&uH4j z+AF0dEmJKPC3H(ecV*f6-5N^&7VfyFW5}gtxtnp(sI^sdkE1(rk$S`)hJtakqzqle zvIjcb;eLG4ドルMy2ugoF9jw-_jPLzk3ドル?2?K>wk9epbJ`)a`4tGP6Be#$O*#^rkX$_) zW#pljQvrgwWk}fW2SIP$Gm-6U<5h5&wux*!vngjojxeeu*6jzwiw|;8lwarr-!n{p z2g$@R0PFrLzgyAZGyhX1h5Q;JJ{!C8Js!^Cz!*hubdOCM`+cFxOKB6IeMt*xIvbmk zhBqYrcuPAPNM|iJbz`-c549OFOQs6##&)I5itN*LlhKr3?yMzD41=|?!OYxi|42hSxIJ-iV zxeNwiZmYw`t2u#)Zj;3eL~YE@Z6?&*GE)lpO5(%B&qw;w*odUcFEGuod$PVwkLvJj zD;s0$Lu{(UgrDl!dP{)vKD|unNdLkvC6{^NX1d-rvEIRKl{i2hOm}egv4#l$_Ke@T zDR>7ne64F36}gvB_Oh#;1DT)NVNz1kTs46VoL(XIl1W5(uLxwuo~P>g=C(N4U|`Vc z_tHQF;gav(UL@S^9FRGn8&ASj?NkMIc^s&?vt-L}&UTzLLAEHv=ayA@ygi~~zPHrS zCzy@Rj}7J9e5>BGcUuHvTg@s4iApl);|I~vizZk)v+32YZtkvTWPa?3QdOSbducgi z(GRzD7FN_rKc`UTUSapz@{zrX(L(eBAJarrswBK!ID)C#Y5UFGEDhaL!dRL}iFljh zj#$t8NDI2lhziZhMO{`zi-|WO6?^$~OV(^q?xI zIA%05T+y4*ZYq5)ZMed!Aq~AV?GLl_mYtI!>K}JHn6dY&c$b+GO+U{NZ=jv9zc=IW z=40B0I#}VMKDgRz-Y3ZC<^+q@wvq7`3{-fe9lgvyjlel?d~m;kfcphholjcmz+-tv zRU|0A?QW#a(H8s6?8oRQ1A_bm8pdNA^QCBg-{c+s_tV~wAD2H#q)m#gDCw(~-b?yu zDtwTs!T-^J849ドルN3e~awly#|w9|F2B;*@bm)rILbwNlDVGgi z$OT8S=V{^O7#2a>VpcX92Bo^Fj{3@^WCJeIc~?Q#XXzgZJX1S7^*SM5YQ>@8z%h@_ z*hUX;?PueO8RcRRgPNJI3~9UUu78(uoZsrRsTv=@v%kVk-Evi?YEW^7QwN>Bm}up; z&Ntii&;rUtE!no>Tzh{ciM)nQZHLsmrLsJBhYfO^OSx|<{jzybuxr~&xkgvnce1w; zyN;Z!*LRw@%r7YPq1ドルzf;|*nS^b;2&PF}lk`iJ+@c`D!G#0zMyD+~ImnNo*6G1WxmT(Gs2s}}Lmfnf- zI192ddZgv>s&1Mnye|5>9$ zZf3ed{!Jqg0fb9QWlNoa$i+ReN~;{@$_KVA+T3_FYm|F&Tn&_msSj*@(C0Gs-QS7- z(6`UzUftMUIRlNBBmY;eQWlP=vW#q-)u+49U)CK6QSVKY)t8Z*(douj4^*)5n;JP= zAj@SfMBI*qgIU>=m($?kedP7=iUw}D?V6X7^mLM)3P0IvZHf-4F2P__m9;iXQ9ei- z7hWg-yOgzr>JGiXL-j*bKx*fvRB?_)8XJir*;zyLZ zm`sYdzu0#-W}uGqa5_onfkh`IL>ml1KzySH$rg8OwbP!5aI3yqG<96jcqi9wryrfz zLUKc7Yd3^naLM$tpnDvX`Qzr)dPjC<^ocnnxc%stgsk?t2_8ekx`ixmq_y~tx58bm z<9j6iyi9wdyu*r-d{@?iznf#vmsfndw#qr0xz*(kpq{d0ok3=epivr;w+e`pp7&le z^X(Kd2v>>Svc~~KmXO$>W9_dS!jJ%~tUJ|w~PCwe?Pl)+3MZtk`=4b6oXQbIKv zlE155!NY5Ni^9W;!cRMccl*2yKAtK`&^f#mT1sNP2SVJ`cz;+w1L5IKe=+%AFWff1 zCDNw7Uc}+)zqLnclZd%SYMpo(gND5ドル^VJd}=rCZXFJ?B0_taf>^2zPf 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ドルPklH*UOW_RBB1-el*E6Ljyf z(7cN^lNTBUmx#1>apL_{*yVQP%F48k?xjpa_rU@YpMJO9jzXa~(67chHnU9UI~^LPAUwB( zfh{_75pY*hHu5r==i&@G+sXm!_-g|ojF#)m&hPBp92ykp5ZbrFpspUDlLq>JGGGo- zz46O_vQ?KRN8ObQX#TnH|KvPe-v^{c#^6qO2eF;TOeQPrHK*wuRf29%&E}mSzV`1N zEe$<+_dk(}t0xae=qqwj_qnkzgrnnmSZ_Rwee&subwcfijZ-8q5Hd&@11q z;w#(rWZEY}ttdce-#~F&JzrA`1vt_FHN&t-c=9RR;q|7j)`b6TG-?&~BLl#}nb0i1 z`()pJKDTX5!w7as!(x&N7_l4IwF#b!2ドルR6sv*R$Srytg8TD`GuD%16VzJ;u86ドルKt=!A$g$>NRjohI_t0@hy}pl5GfW?TDJU6R%`3wuo_ zgJp_Pm(tvQC8U!tO zweFhk=Qmyr#+>^pUQkO*a$HDhNZLf5z&MFn!cP@LgtNU7r@04kzOa-_i)wr)gNq*o zUnOC6ドルMsr5QW2mECFJvLIh*|bS62ChC&{9WBsc2eW#EYmX5h-UUs>3ayCF5bsuCKa zEH*l$d*Q2!9yP19M-N{ARoen46VSG{-?^!^K#vuHY6PS#$A_m*i-X-$fQ)G1i%cWs zEWQ4@di}p7Tx4T`FpZrIP@Q`DYTPak8Yfc}Hbg{xQ<56m0h8d*e-*kcz`uileo{q7 z%cexMe4mfneN4mP!&UkAoCQ~I{+$#d;jz)077Gyl53_caZ}4R))|3a(W>VE==^}u) zJw3z6ドルr6w^IV?z*ja1VdAjS6vad8O!1I{h!zTWs1-xiku4U6gDfL1jIAne?QsBl2{ zvcZ+()a}eIGSOv<#$bjnrqga8qcfhh|nlcz_={_xg?s17;nma9_up=}e7bzb2nd_* zo@l$>9ドルDa3F+Rb5z1aA;gd%u)>dQCQJTrGHU%mS&V^0s zZvB$mVM8PJBH%Vw6OfQB{c2f#k2oOZu?tZ&{C`DEvu!VUnb36DC+M+3n0TEmv*K*zL^Em zz8`V`$afGfu|%bR4tTF!5HbW#_(^eggU1TE)ZM$)?r{f@-P&1ドルzt{W34`j0c26Bx+ zycgO7=sJ;SrEujN%T+N5Rb04;!3ov~#(TFTE1oj306evq%21l3Qfx=~*h16O?|{X1TICK%@!^0zFg*x~b{ zMBdH+iaPuNr9B5QF%Pa2TqpI^g>6P`*CxBil5lZ$D20q6dNi-B1lY9N?T1+>ruS+C zW~KXwMGxG19$|%xx&8fcDEjaYP#R5a?#^G)+R-%f%E)^bl|0AW(?Y|y@&NOm9w#P% z_7DGe`EY-5kf}AuU|9sD% z8)Ont+uTuF1v&7SZ_KtIy+j?5z66pf_)Bkg)MoZ95AC{IrW zBmi%8ofO9hTHL^+VR8)ti2t}udkL72DaaESgu`(OGH2{*E(`=!Bz&)*GYbQ|Id!7T zb_@*p8-n4ssDFqH<-w`unh2lyi@)nsxqo(#ao#xfk3`1)wg~whup~n5hsiy1e%8{p zdL?XXfC!QEKNhbBjEwIv?3-orY}|W^doNlp`k)f}P2?wj949mj8Vhn}8Rha;T5(9<~;1*gplj|exnsxy>PYy@2 z*B2!C2L`I{+^SRuRY zk`h}5efq7F!^6Wt{PW65_rlN}Ginmy;fAFCn#ig@`<@p&o0^7ドル{i)vyunbr<_x zmn_pfSt>Wk)saP%$!$XPKZRbE{Dj21pI z!5n@v_!{wflQ-fJ4;^>WE%49>dX_nl4ドルI8Ri?<<=l}y{*0ドルkwyhq`_m^9pcbhxqnu z>(1_Ze!HP{O^E2*87)d;pE){f0&9?2oU`yzazd08r_52plc7Kn&me!-u(DJOL|VEx zv(4@Uy~Nic@~AHXhwpL&WNvM~ku`9q@<|gptfrr5d0g2tb}l82g)trs5x@h6xxpzp z1VvPoo~KjR6K(q?ue0-|a^fwQk7VgBJP3xr^gZ2pc64ドル z&<*9{czlmrwl+g)z|?t!tv3t9gq(ohrtj|sikslu#qolcnj~7635;ybpnd;!&|#|b zL-*$va$ZE##7kLu8OL&*t6H}2HbZYa+Zw*_cn7`%$qIMq`Ti~_XkTDS8lS-VBaf1| zKxW*g*p>(Nch6ドル+m?v$nPf%$#AW%=r8Is_jPs3_~7@|#YyL}82Gc81YNBO*r5g9dc z_)&NZssLMjyZ@spsHFXUd(3>;r;9}jWwCz18{aVLxU(=GB zJxB7;_Bn3qRUS!(seYS|e2LMmoH-DI+lS8whc*krN=i!o(}Q_BvMOXCXbP!~vvZ~E z#Mzom2QVpv#Rwvq-ou1z!z)ogH&BAq5DJ1`nTctnFmM&eXIWT+z*ID%-iPbFkBN>5 zf2#46Ze=mO4WyY;W>P#kIXO6oPjaM^c9WVaocwWMXK?UL$<<)br^c=slg0lcflsyx z7#mXx6W9I>&BmF4g%4`*5+1sj(oRBDRKb7D;q{vH)!E|p6Ywi3VWd6WrN*QhsHoRf z`8SZC3JQ8CQBuLaL7`8kQa@)02)yevRD1^dKGn3#qpCyW#@i>^a(r}P+WMd&;0Pf2 zdP)@S{b!qp_4T7w4jRit(vo;Z=Y~C&0JR8=Hz!=2RP^@dDv1sz*_CQQVLeLi{t->OFt>#PPBD zUPA2o=K9&6v>O~tztch^7baua-cu0xLw-E zXEWBa#>jowQc*cG^%6vW$f?fsA5t^fJkK-N0@m{jn z==`Wgk{jl`xLM3XOw9Xm15JdNWL3}2N5*v?gDeDV6l`W~xw8hp&k&P^A;6wLT(vD_|rw4oRx zj7BjAE{5g?Bw3jdNHqjwFi_{!i&C<*gblt67cwgtvcecrdx;YnZi_zhysxlgUO zt&4M6VYJ@V{2rseUE#T5oM+7+a7w>OWv@}`;oPLP-R-%#PzdGO6mvRHb!kcBr0*+cwayDFIB#mYnIRPY?dcMCr#te2nyy)V`A>ZhPB(^#u`DGal+_hX^9VheQCqh96QYtMG9i|lEJ7B_f z^^F3gNk=jFZ2i1x&cUt~_yf>O=ai`N;>7p`Pf!Oh>OTDDG=P)Ta+2uMUf(P@(dp1* z?B2b@ojD&*4xPC^cNM+FH8SkNT|Pc^M}~;0h=jUfSE!k3@GSipq_}T)qVSvDNp04P z#jOWMGT+svcHW2*%`Cna85y-(*qqqL&nw+SVuM~%Eg+j@JzP;$pP!A-H^92YsNH)8 z)YTHnQbrM)_VKf>&K7N8Y!6K4G+z+R=wwL0{Zi2fN<0*}n=g7z)v_`jc zCbxz6`M8`Lhbz|NAr$VfN6JE|VV#kl;x=dF1;$d?j4>-_ST|l__tF|$ETGE_se)5w zV9^5RLsBYlpkPqYM=r5Y!-Q5?^5d%;vXA-$_6~TRH@U}-becEE=iXn}eM9tXg9{u# z8{V+p;K6{84i`~yeDcjX@lcWe;4G%RaVK{k!)MAI(zm>-YI&V`_u_#Z^7_%!>vz%Y z1<&z;*szw2=txmxs=;c$dti81z`6f8q|!}t^slcatb1ybwx4a+-(zwo_4&gzregff zq;#|gcWGYD$uW}GDB64B11Wp5tjDf#Z9y%lv!2%V5vc(}v}$HEPq@=`a6U|mq~f_` zXI_ET>PGkHrFOnr2MisrETg|`TXS$=p-2g8h9%5z9!H|CqbL#vA zSst%Wwc33oHQ$IaJf=UI9zp?A>iSA6uj*)ISmio`T#mcB6`8&Y=eaX?JQOhioj zbv=|IO|B!{m$R47Y(-f{CyNWb{#3EP5Nrw>6yS{}ZD2lW+{l<9as>=fF#l-4Ixw0* zyo288rmC#g1JdR}Yv7HqA8(TV%p6CDJgCI&^3^&#Ekq-9VaLs{58{JRS46w*ijE0J zptI9iEKDd3SI)7&WRGwioO1@^Z*{53<~z3m4@q*efk4a-wfcb|?v!c}7b{q0j0;ew z^?K?qrTM3&0B4eJx8cgn8RX@#yX=SN=iD#bw1N&hXe*gdg literal 0 HcmV?d00001 diff --git "a/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" "b/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" index b6d137a..4c59e66 100644 --- "a/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" +++ "b/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" @@ -21,8 +21,7 @@ Martin Fowler在自己网站上写了一篇LMAX架构的文章,LMAX是一种 # 3 相关概念 -![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/42a0a0b512744b1fadf0a05bae213a84~tplv-k3u1fbpfcp-watermark.image?) - +![img.png](images/img.png) **Disruptor**:是使用`Disruptor`框架的核心类,持有`RingBuffer`、消费者线程池、消费者集合`ConsumerRepository`和消费者异常处理器`ExceptionHandler`等引用; @@ -132,8 +131,7 @@ public class LongEventMain 输出结果: -![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/599d44256be84bfea44f5c9dc36a4f33~tplv-k3u1fbpfcp-watermark.image?) - +![img_1.png](images/img_1.png) 参考:https://lmax-exchange.github.io/disruptor/user-guide/index.html From fbfe5c966a497ea96b8e0c0d736c73b4c451d610 Mon Sep 17 00:00:00 2001 From: yuanmabiji <13570990660@163.com> Date: 2022年3月25日 20:48:15 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E5=88=9D?= =?UTF-8?q?=E8=AF=86Disruptor=E6=A1=86=E6=9E=B6=E3=80=8B=E4=B8=80=E6=96=87?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10235円350円257円206円Disruptor346円241円206円346円236円266円.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" "b/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" index 4c59e66..b06975a 100644 --- "a/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" +++ "b/Disruptor/345円210円235円350円257円206円Disruptor346円241円206円346円236円266円.md" @@ -19,9 +19,12 @@ Martin Fowler在自己网站上写了一篇LMAX架构的文章,LMAX是一种 5. 使用内存屏障 6. 序号栅栏机制 + + # 3 相关概念 -![img.png](images/img.png) +![img.png](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/images/img.png?raw=true) + **Disruptor**:是使用`Disruptor`框架的核心类,持有`RingBuffer`、消费者线程池、消费者集合`ConsumerRepository`和消费者异常处理器`ExceptionHandler`等引用; @@ -131,7 +134,7 @@ public class LongEventMain 输出结果: -![img_1.png](images/img_1.png) +![img_1.png](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/images/img_1.png?raw=true) 参考:https://lmax-exchange.github.io/disruptor/user-guide/index.html From dcd4be818babdf44143f4f1844104571beffc8c3 Mon Sep 17 00:00:00 2001 From: yuanmabiji <13570990660@163.com> Date: 2022年3月25日 21:43:29 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E5=88=9D?= =?UTF-8?q?=E8=AF=86Disruptor=E6=A1=86=E6=9E=B6=E3=80=8B=E4=B8=80=E6=96=87?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d21d43d..043f07e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ 【**源码笔记**】专注于Java后端系列框架的源码分析。若觉得源码分析文章不错,欢迎Star哦。 +公众号: + +![img_1.png](https://common-ymbj.oss-cn-beijing.aliyuncs.com/wxgzh_qrcode.PNG) + + + 由于【源码笔记】今年2月初才开始写源码分析文章,因此目前源码分析文章还不是很多,计划每周持续推出一到两篇Java后端框架源码系列的文章,随着时间的积累,Java后端源码分析文章肯定会越来越多,越来越丰富哦,敬请关注。 ### 目录 From dce4e9c04372ace4a221038f637a0cb28d0ccc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E7=A0=81=E7=AC=94=E8=AE=B0?= <63114411+yuanmabiji@users.noreply.github.com> Date: 2022年3月31日 21:56:14 +0800 Subject: [PATCH 7/9] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 043f07e..46648eb 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ![img_1.png](https://common-ymbj.oss-cn-beijing.aliyuncs.com/wxgzh_qrcode.PNG) +**温馨提示**:github上前期文章图片失效了,如果想阅读前期文章的话还请移步公众号阅读哦。 - -由于【源码笔记】今年2月初才开始写源码分析文章,因此目前源码分析文章还不是很多,计划每周持续推出一到两篇Java后端框架源码系列的文章,随着时间的积累,Java后端源码分析文章肯定会越来越多,越来越丰富哦,敬请关注。 +【源码笔记】计划每周持续推出一篇Java后端框架源码系列的文章,随着时间的积累,Java后端源码分析文章肯定会越来越多,越来越丰富哦,敬请关注。 ### 目录 From 46a60288ed7c33c1c1df13ea9df7f06639acbb0b Mon Sep 17 00:00:00 2001 From: yuanmabiji <13570990660@163.com> Date: Tue, 5 Apr 2022 09:58:07 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8ADisruptor?= =?UTF-8?q?=E5=B9=BF=E6=92=AD=E6=A8=A1=E5=BC=8F=E4=B8=8E=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E9=93=BE=E6=BA=90=E7=A0=81=E5=88=86=E6=9E=90?= =?UTF-8?q?=E3=80=8B=E4=B8=80=E6=96=87=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20347円240円201円345円210円206円346円236円220円.md" | 702 ++++++++++++++++++ README.md | 12 +- 2 files changed, 709 insertions(+), 5 deletions(-) create mode 100644 "Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" diff --git "a/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" "b/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" new file mode 100644 index 0000000..9e087d9 --- /dev/null +++ "b/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" @@ -0,0 +1,702 @@ +> 【源码笔记】专注于Java后端系列框架源码分析,Github地址:https://github.com/yuanmabiji/Java-SourceCode-Blogs + +# 1 前言 + +本篇文章开始`Disruptor`的源码分析,理解起来相对比较困难,特别是`Disruptor`的`sequenceBarrier`的理解,`sequenceBarrier`包括生产者与消费者之间的`gatingSequence`以及消费者与消费者之间的`dependentSequence`。此外,`Disruptor`源码中的`sequence`变量也比较多,需要捋清楚各种`sequence`的含义。最后,建议小伙伴们动手调试理解,效果会更好。 + +# 2 Disruptor六边形DEMO + +分析源码前,先来看看`Disruptor`六边形执行器链的`DEMO`。 + +```java +public class LongEventMain +{ + private static final int BUFFER_SIZE = 1024; + public static void main(String[] args) throws Exception + { + // 1,构建disruptor + final Disruptor disruptor = new Disruptor( + new LongEventFactory(), + BUFFER_SIZE, + Executors.newFixedThreadPool(5), // 【注意点】线程池需要保证足够的线程:有多少个消费者就要有多少个线程,否则有些消费者将不会执行,生产者可能也会一直阻塞下去 + ProducerType.SINGLE, + new YieldingWaitStrategy() + ); + + EventHandler eventHandler1 = new LongEventHandler1(); + EventHandler eventHandler2 = new LongEventHandler2(); + EventHandler eventHandler3 = new LongEventHandler3(); + EventHandler eventHandler4 = new LongEventHandler4(); + EventHandler eventHandler5 = new LongEventHandler5(); + + // 方式1 构建串行执行顺序: + /*disruptor + .handleEventsWith(eventHandler1) + .handleEventsWith(eventHandler2) + .handleEventsWith(eventHandler3) + .handleEventsWith(eventHandler4) + .handleEventsWith(eventHandler5);*/ + + // 方式2 构建并行执行顺序 + /*disruptor + .handleEventsWith(eventHandler1, eventHandler2, eventHandler3, eventHandler4, eventHandler5);*/ + + // 方式3 构建菱形执行顺序 + /*disruptor.handleEventsWith(eventHandler1, eventHandler2) + .handleEventsWith(eventHandler3);*/ + + // 2,构建eventHandler执行链 + // 方式4 构建六边形执行顺序 + disruptor.handleEventsWith(eventHandler1, eventHandler3); + disruptor.after(eventHandler1).handleEventsWith(eventHandler2); + disruptor.after(eventHandler3).handleEventsWith(eventHandler4); + disruptor.after(eventHandler2, eventHandler4).handleEventsWith(eventHandler5); + + // 3, 启动disruptor即启动线程池线程执行BatchEventProcessor任务 + disruptor.start(); + + // 4,生产者往ringBuffer生产数据并唤醒所有的消费者消费数据 + RingBuffer ringBuffer = disruptor.getRingBuffer(); + ByteBuffer bb = ByteBuffer.allocate(8); + bb.putLong(0, 666); + ringBuffer.publishEvent(new LongEventTranslatorOneArg(), bb); + } + + static class LongEventTranslatorOneArg implements EventTranslatorOneArg { + @Override + public void translateTo(LongEvent event, long sequence, ByteBuffer buffer) { + event.set(buffer.getLong(0)); + } + } + + static class LongEvent + { + private long value; + + public void set(long value) + { + this.value = value; + } + + public long get() { + return this.value; + } + } + + static class LongEventFactory implements EventFactory + { + @Override + public LongEvent newInstance() + { + return new LongEvent(); + } + } + + static class LongEventHandler1 implements EventHandler + { + @Override + public void onEvent(LongEvent event, long sequence, boolean endOfBatch) + { + System.out.println("LongEventHandler1-" + event.get() + " executed by " + Thread.currentThread().getName()); + } + } + + static class LongEventHandler2 implements EventHandler + { + @Override + public void onEvent(LongEvent event, long sequence, boolean endOfBatch) + { + System.out.println("LongEventHandler2-" + event.get() + " executed by " + Thread.currentThread().getName()); + } + } + + static class LongEventHandler3 implements EventHandler + { + @Override + public void onEvent(LongEvent event, long sequence, boolean endOfBatch) + { + System.out.println("LongEventHandler3-" + event.get() + " executed by " + Thread.currentThread().getName()); + } + } + + static class LongEventHandler4 implements EventHandler + { + @Override + public void onEvent(LongEvent event, long sequence, boolean endOfBatch) + { + System.out.println("LongEventHandler4-" + event.get() + " executed by " + Thread.currentThread().getName()); + } + } + + static class LongEventHandler5 implements EventHandler + { + @Override + public void onEvent(LongEvent event, long sequence, boolean endOfBatch) + { + System.out.println("LongEventHandler5-" + event.get() + " executed by " + Thread.currentThread().getName()); + } + } +} +``` +这个`Demo`也是`Disruptor`广播模式与执行顺序链构建的`Demo`,有以下值得注意的点: +1. 生产者总是要把`RingBuffer`填充完一圈后才会考虑追赶消费者进度的问题; +2. 线程池需要保证足够的线程:有多少个消费者就要有多少个线程,否则有些消费者将不会执行(消费者线程起不来),生产者生产完一圈`RingBuffer`后即使有新的数据生产者也会一直阻塞下去; +3. 消费者执行链中,每个消费者都是独立的消费线程,决定当前消费者消不消费的只有其依赖的消费者有无消费完,消费者进行消费第二个数据时无须等整个执行链执行完才能消费。比如有执行链:A->B-C,生产者在`Ringbuffer`中生产了2个数据,那么消费顺序可能为A->B->C->A->B-C,也可能为A->B-A->B->C->C,也可能为A->A->B->B->C->C等。 +4. 生产者填充完第一圈`Ringbuffer`后,当要追赶消费者消费速度时,此时生产者能否继续生产取决于执行链最后一个消费者的消费速度。比如有执行链:A->B-C,生产者的生产速度取决于消费者C的消费速度。 + +# 3 初始化Disruptor实例 + +先来看下前面DEMO中的初始化`Disruptor`实例代码: + +```java +// 1,构建disruptor +final Disruptor disruptor = new Disruptor( + new LongEventFactory(), + BUFFER_SIZE, + Executors.newFixedThreadPool(5), // 线程池需要保证足够的线程 + ProducerType.SINGLE, + new YieldingWaitStrategy() +); +``` + +这句代码最终是给`Disruptor`的`ringBuffer`和`executor`属性赋值: + +```java +// Disruptor.java +public Disruptor( + final EventFactory eventFactory, + final int ringBufferSize, + final Executor executor, + final ProducerType producerType, + final WaitStrategy waitStrategy) +{ + this( + // 创建RingBuffer实例 + RingBuffer.create(producerType, eventFactory, ringBufferSize, waitStrategy), + executor); +} + +private Disruptor(final RingBuffer ringBuffer, final Executor executor) +{ + this.ringBuffer = ringBuffer; + this.executor = executor; +} +``` + +那么`RingBuffer`实例又是如何创建的呢?我们来看下`RingBuffer.create(producerType, eventFactory, ringBufferSize, waitStrategy)`这句源码: + +```java +// RingBuffer.java +public static RingBuffer create( + final ProducerType producerType, + final EventFactory factory, + final int bufferSize, + final WaitStrategy waitStrategy) +{ + switch (producerType) + { + case SINGLE: + return createSingleProducer(factory, bufferSize, waitStrategy); + case MULTI: + return createMultiProducer(factory, bufferSize, waitStrategy); + default: + throw new IllegalStateException(producerType.toString()); + } +} +``` + +首先会根据`producerType`来创建不同的`Producer`,以创建`SingleProducerSequencer`实例为例进去源码看下: + +```java +// RingBuffer.java +public static RingBuffer createSingleProducer( + final EventFactory factory, + final int bufferSize, + final WaitStrategy waitStrategy) + { + // 1,创建SingleProducerSequencer实例 + SingleProducerSequencer sequencer = new SingleProducerSequencer(bufferSize, waitStrategy); + // 2,创建RingBuffer实例 + return new RingBuffer(factory, sequencer); + } +``` + +## 3.1 创建SingleProducerSequencer实例 + +首先创建了`SingleProducerSequencer`实例,给`SingleProducerSequencer`实例的`bufferSize`和`waitStrategy`赋初值; + +```java +// AbstractSequencer.java +// SingleProducerSequencer父类 +public AbstractSequencer(int bufferSize, WaitStrategy waitStrategy) +{ + this.bufferSize = bufferSize; + this.waitStrategy = waitStrategy; +} +``` + +此外,创建`SingleProducerSequencer`实例时还初始化了一个成员变量`cursor`: + +```java +protected final Sequence cursor = new Sequence(Sequencer.INITIAL_CURSOR_VALUE); +``` + +即给`cursor`赋值了一个`Sequence`实例对象,`Sequence`是标识`RingBuffer`环形数组的下标,同时生产者和消费者也会同时维护各自的`Sequence`。最重要的是,**`Sequence`通过填充CPU缓存行避免了伪共享带来的性能损耗**,来看下其填充缓存行源码: + +```java +// Sequence.java +class LhsPadding +{ + // 左填充 + protected long p1, p2, p3, p4, p5, p6, p7; +} + +class Value extends LhsPadding +{ + // Sequence值 + protected volatile long value; +} + +class RhsPadding extends Value +{ + // 右填充 + protected long p9, p10, p11, p12, p13, p14, p15; +} + +public class Sequence extends RhsPadding +{ + // ... +} +``` + + + +## 3.2 创建RingBuffer实例 + +然后核心是创建`RingBuffer`实例,看看最终创建`RingBuffer`实例源码: + +```java +// RingBuffer.java +RingBufferFields( // RingBufferFields为RingBuffer父类 + final EventFactory eventFactory, + final Sequencer sequencer) +{ + this.sequencer = sequencer; + this.bufferSize = sequencer.getBufferSize(); + + if (bufferSize < 1) + { + throw new IllegalArgumentException("bufferSize must not be less than 1"); + } + if (Integer.bitCount(bufferSize) != 1) + { + throw new IllegalArgumentException("bufferSize must be a power of 2"); + } + + this.indexMask = bufferSize - 1; + // 【重要特性】内存预加载,内存池机制 + this.entries = (E[]) new Object[sequencer.getBufferSize() + 2 * BUFFER_PAD]; + fill(eventFactory); +} +``` + +可以看到先前创建的`SingleProducerSequencer`实例作为构造参数传入给了`RingBuffer`实例的`sequencer`属性赋初值,然后最重要的是在创建`RingBuffer`实例时,会为`RingBuffer`的环形数组提前填充`Event`对象,即**内存池机制**: + +```java +// RingBuffer.java +private void fill(final EventFactory eventFactory) +{ + for (int i = 0; i < bufferSize; i++) + { + entries[BUFFER_PAD + i] = eventFactory.newInstance(); + } +} +``` + +内存池机制好处: + +1. 提前创建好复用的对象,减少程序运行时因为创建对象而浪费性能,其实也是一种空间换时间的思想; +2. 因为环形数组对象可复用,从而避免GC来提高性能。 + +# 4 构建执行顺序链 + +```java +// 2,构建eventHandler执行链:构建六边形执行顺序 +disruptor.handleEventsWith(eventHandler1, eventHandler3); +disruptor.after(eventHandler1).handleEventsWith(eventHandler2); +disruptor.after(eventHandler3).handleEventsWith(eventHandler4); +disruptor.after(eventHandler2, eventHandler4).handleEventsWith(eventHandler5); +``` + +![](https://common-ymbj.oss-cn-beijing.aliyuncs.com/Disruptor/2/1.png) + +再来看看`Disruptor`构建执行顺序链相关源码: + +先来看看`disruptor.handleEventsWith(eventHandler1, eventHandler3);`源码: + +```java +// Disruptor.java +public final EventHandlerGroup handleEventsWith(final EventHandler... handlers) +{ + return createEventProcessors(new Sequence[0], handlers); +} + +EventHandlerGroup createEventProcessors( + final Sequence[] barrierSequences, + final EventHandler[] eventHandlers) +{ + checkNotStarted(); + // 根据eventHandlers长度来创建多少个消费者Sequence实例,注意这个processorSequences是传递到EventHandlerGroup用于构建执行顺序链用的, + // 比如有执行顺序链:A->B,那么A的sequenct即processorSequences会作为B节点的barrierSequences即dependencySequence + final Sequence[] processorSequences = new Sequence[eventHandlers.length]; + // 新建了一个ProcessingSequenceBarrier实例返回 + // ProcessingSequenceBarrier实例作用:序号屏障,通过追踪生产者的cursorSequence和每个消费者( EventProcessor) + // 的sequence的方式来协调生产者和消费者之间的数据交换进度 + final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);// 如果构建执行顺序链比如A->B,那么barrierSequences是A消费者的sequence;如果是A,C->B,那么barrierSequences是A和C消费者的sequence + + for (int i = 0, eventHandlersLength = eventHandlers.length; i < eventHandlersLength; i++) + { + final EventHandler eventHandler = eventHandlers[i]; + // 有多少个eventHandlers就创建多少个BatchEventProcessor实例(消费者), + // 但需要注意的是同一批次的每个BatchEventProcessor实例共用同一个SequenceBarrier实例 + final BatchEventProcessor batchEventProcessor = + new BatchEventProcessor(ringBuffer, barrier, eventHandler); + + if (exceptionHandler != null) + { + batchEventProcessor.setExceptionHandler(exceptionHandler); + } + // 将batchEventProcessor, eventHandler, barrier封装成EventProcessorInfo实例并加入到ConsumerRepository相关集合 + // ConsumerRepository作用:提供存储机制关联EventHandlers和EventProcessors + consumerRepository.add(batchEventProcessor, eventHandler, barrier); // // 如果构建执行顺序链比如A->B,那么B消费者也一样会加入consumerRepository的相关集合 + // 获取到每个消费的消费sequece并赋值给processorSequences数组 + // 即processorSequences[i]引用了BatchEventProcessor的sequence实例, + // 但processorSequences[i]又是构建生产者gatingSequence和消费者执行器链dependentSequence的来源 + processorSequences[i] = batchEventProcessor.getSequence(); + } + // 总是拿执行器链最后一个消费者的sequence作为生产者的gateingSequence + updateGatingSequencesForNextInChain(barrierSequences, processorSequences); + // 最终返回封装了Disruptor、ConsumerRepository和消费者sequence数组processorSequences的EventHandlerGroup对象实例返回 + return new EventHandlerGroup(this, consumerRepository, processorSequences); +} +``` + +构建`Disruptor`执行顺序链的核心逻辑就在这段源码中,我们缕一缕核心逻辑: + +1. 有多少个`eventHandlers`就创建多少个`BatchEventProcessor`实例(消费者),`BatchEventProcessor`消费者其实就是一个实现`Runnable`接口的线程实例; +2. 每个`BatchEventProcessor`实例(消费者)拥有前一个消费者的`sequence`作为其`sequenceBarrier`即`dependentSequence`; +3. 当前消费者的`sequence`通过`EventHandlerGroup`这个载体来传递给下一个消费者作为其`sequenceBarrier`即`dependentSequence`。 + +再来看看`diruptor.after(eventHandler1)`源码: + +```java +// Disruptor.java +public final EventHandlerGroup after(final EventHandler... handlers) +{ + // 获取指定的EventHandler的消费者sequence并赋值给sequences数组, + // 然后重新新建一个EventHandlerGroup实例返回(封装了前面的指定的消费者sequence被赋值 + // 给了EventHandlerGroup的成员变量数组sequences,用于后面指定执行顺序用) + final Sequence[] sequences = new Sequence[handlers.length]; + for (int i = 0, handlersLength = handlers.length; i < handlersLength; i++) + { + sequences[i] = consumerRepository.getSequenceFor(handlers[i]); + } + + return new EventHandlerGroup(this, consumerRepository, sequences); +} +``` + +这段源码做的事情也是将当前消费者`sequence`封装进`EventHandlerGroup`,从而可以通过这个载体来传递给下一个消费者作为其`sequenceBarrier`即`dependentSequence`。 + +最终构建的最终`sequence`依赖关系如下图,看到这个图不禁让我想起`AQS`的线程等待链即CLH锁的变相实现,附上文章链接,有兴趣的读者可以比对理解。[AQS基础——多图详解CLH锁的原理与实现](https://mp.weixin.qq.com/s/xBw7koGuZtqU8imZ9_JzDA) + +![](https://common-ymbj.oss-cn-beijing.aliyuncs.com/Disruptor/2/20220404235504.png) + +# 5 启动Disruptor实例 + +```java +// 3, 启动disruptor即启动线程池线程执行BatchEventProcessor任务 +disruptor.start(); +``` + +我们再来看看` disruptor.start()`这句源码: + +```java +// Disruptor.java +public RingBuffer start() +{ + checkOnlyStartedOnce(); + // 遍历每一个BatchEventProcessor消费者(线程)实例,并把该消费者线程实例跑起来 + for (final ConsumerInfo consumerInfo : consumerRepository) + { + consumerInfo.start(executor); + } + + return ringBuffer; +} +``` + +其实这里做的事情无非就是遍历每个消费者线程实例,然后启动每个消费者线程实例`BatchEventProcessor`,其中`BatchEventProcessor`被封装进`ConsumerInfo`实例。还没生产数据就启动消费线程的话,此时消费者会根据阻塞策略`WaitStrategy`进行阻塞。 + +# 6 生产消费数据 + +## 6.1 生产者生产数据 + +```java +// 4,生产者往ringBuffer生产数据并唤醒所有的消费者消费数据 +RingBuffer ringBuffer = disruptor.getRingBuffer(); +ByteBuffer bb = ByteBuffer.allocate(8); +bb.putLong(0, 666); +ringBuffer.publishEvent(new LongEventTranslatorOneArg(), bb); +``` + +生产者生产数据的源码在`ringBuffer.publishEvent(new LongEventTranslatorOneArg(), bb);`中。 + +```java +// RingBuffer.java +public void publishEvent(final EventTranslatorOneArg translator, final A arg0) +{ + // 【1】获取下一个RingBuffer中需填充数据的event对象的序号,对应生产者 + final long sequence = sequencer.next(); + // 【2】转换数据格式并生产数据并唤醒消费者 + translateAndPublish(translator, sequence, arg0); +} +``` + +### 6.1.1 生产者获取RingBuffer的sequence + +先来看下单生产者获取`sequence`的源码: + +```java +// SingleProducerSequencer.java +public long next(final int n) +{ + if (n < 1 || n> bufferSize) + { + throw new IllegalArgumentException("n must be> 0 and < bufferSize"); + } + // 总是拿到生产者已生产的当前序号 + long nextValue = this.nextValue; + // 获取要生产的下n个序号 + long nextSequence = nextValue + n; + // 生产者总是先有bufferSize个坑可以填,所以nextSequence - bufferSize + long wrapPoint = nextSequence - bufferSize; + // 拿到上一次的GatingSequence,因为是缓存,这里不是最新的 + long cachedGatingSequence = this.cachedValue; + // 如果生产者生产超过了消费者消费速度,那么这里自旋等待,这里的生产者生产的下标wrapPoint是已经绕了RingBuffer一圈的了哈 + if (wrapPoint> cachedGatingSequence || cachedGatingSequence> nextValue) + { + cursor.setVolatile(nextValue); // StoreLoad fence + + long minSequence; + // 自旋等待,其中gatingSequences是前面构建执行顺序链时的最后一个消费者的sequence + while (wrapPoint> (minSequence = Util.getMinimumSequence(gatingSequences, nextValue))) + { + LockSupport.parkNanos(1L); // TODO: Use waitStrategy to spin? + } + + this.cachedValue = minSequence; + } + // 将获取的nextSequence赋值给生产者当前值nextValue + this.nextValue = nextSequence; + + return nextSequence; +} +``` + +这段源码相对较难,我们缕一缕: + +1. 生产者把第一圈`RingBuffer`的坑填完后,此时生产者进入`RingBuffer`第2圈,如果消费者消费速度过慢,此时生产者很可能会追上消费者,如果追上消费者那么就让生产者自旋等待; + +2. 第1点的**如果消费者消费速度过慢**,对于构建了一个过滤器链的消费者中,那么指的是哪个消费者呢?指的就是执行器链最后执行的那个消费者,`gatingSequences`就是执行器链最后执行的那个消费者的`sequence`;**这个`gatingSequences`其实就是防止生产者追赶消费者的`sequenceBarrier`**; + + ![](https://common-ymbj.oss-cn-beijing.aliyuncs.com/Disruptor/2/20220404235652.png) + +3. 生产者总是先把第一圈`RingBuffer`填满后,才会考虑追赶消费者的问题,因此才有`wrapPoint> cachedGatingSequence`的评判条件。 + +前面是单生产者获取`sequence`的源码,对于多生产者`MultiProducerSequencer`的源码逻辑也是类似,只不过将生产者当前值`cursor`和`cachedGatingSequence`用了CAS操作而已,防止多线程问题。 + + + +### 6.1.2 生产者生产数据并唤醒消费者 + +再来看看` translateAndPublish(translator, sequence, arg0)`源码: + +```java +// RingBuffer.java +private void translateAndPublish(final EventTranslatorOneArg translator, final long sequence, final A arg0) +{ + try + { + // 【1】将相应数据arg0转换为相应的Eevent数据,其中get(sequence)会从RingBuffer数组对象池中取出一个对象,而非新建 + translator.translateTo(get(sequence), sequence, arg0); + } + finally + { + // 【2】发布该序号说明已经生产完毕供消费者使用 + sequencer.publish(sequence); + } +} + + + +// SingleProducerSequencer.java +public void publish(final long sequence) +{ + // 【1】给生产者cursor游标赋值新的sequence,说明该sequenc对应的对象数据已经填充(生产)完毕 + cursor.set(sequence);// 这个cursor即生产者生产时移动的游标,是AbstractSequencer的成员变量 + // 【2】根据阻塞策略将所有消费者唤醒 + // 注意:这个waitStrategy实例是所有消费者和生产者共同引用的 + waitStrategy.signalAllWhenBlocking(); +} + +``` + +生产者生产数据并唤醒消费者的注释已经写得很清楚了,这里需要注意的点: + +1. `cursor`才是生产者生产数据的当前下标,消费者消费速度有无追赶上生产者就是拿消费者的消费`sequence`跟生产者的`cursor`比较的,因此生产者生产数据完成后需要给`cursor`赋值; +2. `waitStrategy`策略对象时跟消费者共用的,这样才能线程间实现阻塞唤醒逻辑。 + +## 6.2 消费者消费数据 + +前面第4节启动`Disruptor`实例中讲到,其实就是开启各个消费者实例`BatchEventProcessor`线程,我们看看其`run`方法中的核心逻辑即`processEvents`源码: + +```java +// BatchEventProcessor.java +private void processEvents() +{ + T event = null; + // nextSequence:消费者要消费的下一个序号 + long nextSequence = sequence.get() + 1L; // 【重要】每一个消费者都是从0开始消费,各个消费者维护各自的sequence + // 消费者线程一直在while循环中不断获取生产者数据 + while (true) + { + try + { + // 拿到当前生产者的生产序号 + final long availableSequence = sequenceBarrier.waitFor(nextSequence); + if (batchStartAware != null) + { + batchStartAware.onBatchStart(availableSequence - nextSequence + 1); + } + // 如果消费者要消费的下一个序号小于生产者的当前生产序号,那么消费者则进行消费 + // 这里有一个亮点:就是消费者会一直循环消费直至到达当前生产者生产的序号 + while (nextSequence <= availableSequence) + { + event = dataProvider.get(nextSequence); + eventHandler.onEvent(event, nextSequence, nextSequence == availableSequence); + nextSequence++; + } + // 消费完后设置当前消费者的消费进度,这点很重要 + // 【1】如果当前消费者是执行链的最后一个消费者,那么其sequence则是生产者的gatingSequence,因为生产者就是拿要生产的下一个sequence跟gatingSequence做比较的哈 + // 【2】如果当前消费者不是执行器链的最后一个消费者,那么其sequence作为后面消费者的dependentSequence + sequence.set(availableSequence); + } + catch (final TimeoutException e) + { + notifyTimeout(sequence.get()); + } + catch (final AlertException ex) + { + if (running.get() != RUNNING) + { + break; + } + } + catch (final Throwable ex) + { + handleEventException(ex, nextSequence, event); + sequence.set(nextSequence); + nextSequence++; + } + } +} +``` + + + +消费者线程起来后,然后进入死循环,持续不断从生产者处**批量**获取可用的序号,如果获取到可用序号后,那么遍历所有可用序号,然后调用`eventHandler`的`onEvent`方法消费数据,`onEvent`方法写的是消费者的业务逻辑。消费完后再设置当前消费者的消费进度,这点很重要,用于构建`sequenceBarrier`包括`gatingSequence`和`dependentSequence`。 + + + +下面再来看看消费者是怎么获取可用的序号的,继续看`sequenceBarrier.waitFor(nextSequence)`源码: + +```java +// ProcessingSequenceBarrier.java + +public long waitFor(final long sequence) + throws AlertException, InterruptedException, TimeoutException +{ + checkAlert(); + // availableSequence:获取生产者生产后可用的序号 + // sequence:消费者要消费的下一个序号 + // cursorSequence:生产者生产数据时的当前序号 + // dependentSequence:第一个消费者即前面不依赖任何消费者的消费者,dependentSequence就是生产者游标; + // 有依赖其他消费者的消费者,dependentSequence就是依赖的消费者的sequence + long availableSequence = waitStrategy.waitFor(sequence, cursorSequence, dependentSequence, this); + + if (availableSequence < sequence) + { + return availableSequence; + } + // 这个主要是针对多生产者的情形 + return sequencer.getHighestPublishedSequence(sequence, availableSequence); +} +``` + +可以看到`ProcessingSequenceBarrier`封装了`WaitStrategy`等待策略实例,此时消费者获取下一批可用序号的逻辑又封装在了`WaitStrategy`的`waitFor`方法中,以`BlockingWaitStrategy`为例来其实现逻辑: + +```java +// BlockingWaitStrategy.java + +public long waitFor(long sequence, Sequence cursorSequence, Sequence dependentSequence, SequenceBarrier barrier) + throws AlertException, InterruptedException +{ + long availableSequence; + // cursorSequence:生产者的序号 + // 第一重条件判断:如果消费者消费速度大于生产者生产速度(即消费者要消费的下一个数据已经大于生产者生产的数据时),那么消费者等待一下 + if (cursorSequence.get() < sequence) + { + lock.lock(); + try + { + while (cursorSequence.get() < sequence) + { + barrier.checkAlert(); + processorNotifyCondition.await(); + } + } + finally + { + lock.unlock(); + } + } + // 第一重条件判断:自旋等待 + // 即当前消费者线程要消费的下一个sequence大于其前面执行链路(若有依赖关系)的任何一个消费者最小sequence(dependentSequence.get()),那么这个消费者要自旋等待, + // 直到前面执行链路(若有依赖关系)的任何一个消费者最小sequence(dependentSequence.get())已经大于等于当前消费者的sequence时,说明前面执行链路的消费者已经消费完了 + while ((availableSequence = dependentSequence.get()) < sequence) + { + barrier.checkAlert(); + ThreadHints.onSpinWait(); + } + + return availableSequence; +} +``` + +可以看到,消费者获取下一批可用消费序号时,此时要经过两重判断: + +1. 第一重判断:**消费者消费的序号不能超过当前生产者消费当前生产的序号**,否则消费者就阻塞等待;当然,这里因为是`BlockingWaitStrategy`等待策略的实现,如果是其他策略,比如`BusySpinWaitStrategy`和`YieldingWaitStrategy`的话,这里消费者是不会阻塞等待的,而是自旋,因此这也是其无锁化的实现了,但就是很耗CPU而已; +2. 第二重判断:**消费者消费的序号不能超过其前面依赖的消费消费的序号**,否则其自旋等待。因为这里是消费者等消费者,按理说前面消费者应该会很快处理完,所以不用阻塞等待;但是消费者等待生产者的话,如果生产者没生产数据的话,消费者还是自旋等待的话会比较浪费CPU,所以对于`BlockingWaitStrategy`策略,是阻塞等待了。 + +# 7 WaitStrategy等待策略 + +最后,再来看下`WaitStrategy`有哪些实现类: + +![](https://common-ymbj.oss-cn-beijing.aliyuncs.com/Disruptor/2/20220404185331.png) + +可以看到消费者的`WaitStrategy`等待策略有8种实现类,可以分为有锁和无锁两大类,然后每一种都有其适用的场合,没有最好的`WaitStrategy`等待策略,只有适合自己应用场景的等待策略。因为其源码不是很难,这里逐一分析。 + + + +> `disruptor`中文源码注释地址:https://github.com/yuanmabiji/disruptor \ No newline at end of file diff --git a/README.md b/README.md index 043f07e..c73a263 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,13 @@ 1. [跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/%E8%B7%9F%E5%A4%A7%E5%AE%B6%E8%81%8A%E8%81%8A%E6%88%91%E4%BB%AC%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%AD%A6%E4%B9%A0%E6%BA%90%E7%A0%81%EF%BC%9F%E5%AD%A6%E4%B9%A0%E6%BA%90%E7%A0%81%E5%AF%B9%E6%88%91%E4%BB%AC%E6%9C%89%E7%94%A8%E5%90%97%EF%BC%9F.md) 2. [分析开源项目源码,我们该如何入手分析?(授人以渔)](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/%E5%88%86%E6%9E%90%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%EF%BC%8C%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E5%85%A5%E6%89%8B%E5%88%86%E6%9E%90%EF%BC%9F%EF%BC%88%E6%8E%88%E4%BA%BA%E4%BB%A5%E6%B8%94%EF%BC%89.md) +================**Disruptor源码专题持续更新中...**==================== +1. [初识Disruptor框架!](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/初识Disruptor框架.md) +2. [Disruptor广播模式与执行顺序链源码分析](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/Disruptor广播模式与执行顺序链源码分析.md) +3. 持续更新中... +* Disruptor源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/Disruptor +* Disruptor源码解析项目(带中文注释):https://github.com/yuanmabiji/disruptor + ================**JUC源码专题持续更新中...**==================== 1. [Java是如何实现Future模式的?万字详解!](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/JUC/Java%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0Future%E6%A8%A1%E5%BC%8F%E7%9A%84%EF%BC%9F%E4%B8%87%E5%AD%97%E8%AF%A6%E8%A7%A3%EF%BC%81.md) 2. 持续更新中... @@ -50,11 +57,6 @@ * JDK源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/JDK * JDK源码解析项目(带中文注释):https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs -================**Disruptor源码专题持续更新中...**==================== -1. [初识Disruptor框架!](https://github.com/yuanmabiji/Java-SourceCode-Blogs/blob/master/Disruptor/初识Disruptor框架.md) -2. 持续更新中... -* Disruptor源码分析专题:https://github.com/yuanmabiji/Java-SourceCode-Blogs/tree/master/Disruptor -* Disruptor源码解析项目(带中文注释):https://github.com/yuanmabiji/disruptor ================**TODO LIST**==================== From 50ab54c1ee4b02b86657717699e247f15b925249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E7=A0=81=E7=AC=94=E8=AE=B0?= <63114411+yuanmabiji@users.noreply.github.com> Date: Tue, 5 Apr 2022 10:29:02 +0800 Subject: [PATCH 9/9] =?UTF-8?q?Update=20Disruptor=E5=B9=BF=E6=92=AD?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8E=E6=89=A7=E8=A1=8C=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E9=93=BE=E6=BA=90=E7=A0=81=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23276円346円272円220円347円240円201円345円210円206円346円236円220円.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" "b/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" index 9e087d9..25d4ed3 100644 --- "a/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" +++ "b/Disruptor/Disruptor345円271円277円346円222円255円346円250円241円345円274円217円344円270円216円346円211円247円350円241円214円351円241円272円345円272円217円351円223円276円346円272円220円347円240円201円345円210円206円346円236円220円.md" @@ -695,8 +695,8 @@ public long waitFor(long sequence, Sequence cursorSequence, Sequence dependentSe ![](https://common-ymbj.oss-cn-beijing.aliyuncs.com/Disruptor/2/20220404185331.png) -可以看到消费者的`WaitStrategy`等待策略有8种实现类,可以分为有锁和无锁两大类,然后每一种都有其适用的场合,没有最好的`WaitStrategy`等待策略,只有适合自己应用场景的等待策略。因为其源码不是很难,这里逐一分析。 +可以看到消费者的`WaitStrategy`等待策略有8种实现类,可以分为有锁和无锁两大类,然后每一种都有其适用的场合,没有最好的`WaitStrategy`等待策略,只有适合自己应用场景的等待策略。因为其源码不是很难,这里不再逐一分析。 -> `disruptor`中文源码注释地址:https://github.com/yuanmabiji/disruptor \ No newline at end of file +> `disruptor`中文源码注释地址:https://github.com/yuanmabiji/disruptor

AltStyle によって変換されたページ (->オリジナル) /