home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_799 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  31.0 KB  |  701 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
  6. import struct
  7. import time
  8. from datetime import datetime
  9. from calibre.devices.errors import PacketError
  10. WORD = '<H'
  11. DWORD = '<I'
  12. DDWORD = '<Q'
  13.  
  14. class PathResponseCodes(object):
  15.     NOT_FOUND = 0xFFFFFFD7L
  16.     INVALID = 0xFFFFFFF9L
  17.     IS_FILE = 0xFFFFFFD2L
  18.     HAS_CHILDREN = 0xFFFFFFCCL
  19.     PERMISSION_DENIED = 0xFFFFFFD6L
  20.  
  21.  
  22. class TransferBuffer(list):
  23.     
  24.     def __init__(self, packet):
  25.         pass
  26.  
  27.     
  28.     def __add__(self, tb):
  29.         return TransferBuffer(list.__add__(self, tb))
  30.  
  31.     
  32.     def __getslice__(self, start, end):
  33.         return TransferBuffer(list.__getslice__(self, start, end))
  34.  
  35.     
  36.     def __str__(self):
  37.         ans = ': '.rjust(10, '0')
  38.         ascii = ''
  39.         for i in range(0, len(self), 2):
  40.             for b in range(2):
  41.                 
  42.                 try:
  43.                     ans += TransferBuffer.phex(self[i + b])
  44.                     None += ascii if self[i + b] > 31 and self[i + b] < 127 else '.'
  45.                 continue
  46.                 except IndexError:
  47.                     break
  48.                     continue
  49.                 
  50.  
  51.             
  52.             ans = ans + ' '
  53.             if (i + 2) % 16 == 0:
  54.                 if i + 2 < len(self):
  55.                     ans += '   ' + ascii + '\n' + (TransferBuffer.phex(i + 2) + ': ').rjust(10, '0')
  56.                     ascii = ''
  57.                 
  58.             i + 2 < len(self)
  59.         
  60.         last_line = ans[ans.rfind('\n') + 1:]
  61.         padding = 50 - len(last_line)
  62.         ans += ''.ljust(padding) + '   ' + ascii
  63.         return ans.strip()
  64.  
  65.     
  66.     def unpack(self, fmt = DWORD, start = 0):
  67.         end = start + struct.calcsize(fmt)
  68.         return ''.join([], []([ chr(i) for i in list.__getslice__(self, start, end) ]))
  69.  
  70.     
  71.     def pack(self, val, fmt = DWORD, start = 0):
  72.         if fmt == WORD:
  73.             val = val % 65536
  74.         
  75.         self[start:start + struct.calcsize(fmt)] = [ ord(i) for i in struct.pack(fmt, val) ]
  76.  
  77.     
  78.     def _normalize(self):
  79.         for i in range(len(self)):
  80.             if self[i] < 0:
  81.                 self[i] = 256 + self[i]
  82.                 continue
  83.         
  84.  
  85.     
  86.     def phex(cls, num):
  87.         (index, sign) = (2, '')
  88.         if num < 0:
  89.             (index, sign) = (3, '-')
  90.         
  91.         h = hex(num)[index:]
  92.         if len(h) < 2:
  93.             h = '0' + h
  94.         
  95.         return sign + h
  96.  
  97.     phex = classmethod(phex)
  98.  
  99.  
  100. class field(object):
  101.     
  102.     def __init__(self, start = 16, fmt = DWORD):
  103.         self._fmt = fmt
  104.         self._start = start
  105.  
  106.     
  107.     def __get__(self, obj, typ = None):
  108.         return obj.unpack(start = self._start, fmt = self._fmt)[0]
  109.  
  110.     
  111.     def __set__(self, obj, val):
  112.         obj.pack(val, start = self._start, fmt = self._fmt)
  113.  
  114.     
  115.     def __repr__(self):
  116.         typ = ''
  117.         if self._fmt == DWORD:
  118.             typ = 'unsigned int'
  119.         
  120.         if self._fmt == DDWORD:
  121.             typ = 'unsigned long long'
  122.         
  123.         return 'An ' + typ + ' stored in ' + str(struct.calcsize(self._fmt)) + ' bytes starting at byte ' + str(self._start)
  124.  
  125.  
  126.  
  127. class stringfield(object):
  128.     
  129.     def __init__(self, length_field, start = 16):
  130.         self._length_field = length_field
  131.         self._start = start
  132.  
  133.     
  134.     def __get__(self, obj, typ = None):
  135.         length = str(self._length_field.__get__(obj))
  136.         return obj.unpack(start = self._start, fmt = '<' + length + 's')[0]
  137.  
  138.     
  139.     def __set__(self, obj, val):
  140.         if isinstance(val, unicode):
  141.             val = val.encode('utf8')
  142.         else:
  143.             val = str(val)
  144.         obj.pack(val, start = self._start, fmt = '<' + str(len(val)) + 's')
  145.  
  146.     
  147.     def __repr__(self):
  148.         return 'A string starting at byte ' + str(self._start)
  149.  
  150.  
  151.  
  152. class Command(TransferBuffer):
  153.     number = field(start = 0, fmt = DWORD)
  154.     type = field(start = 4, fmt = DDWORD)
  155.     length = field(start = 12, fmt = DWORD)
  156.     
  157.     def data(self):
  158.         doc = ' \n        The data part of this command. Returned/set as/by a TransferBuffer. \n        Stored at byte 16.\n        \n        Setting it by default changes self.length to the length of the new \n        buffer. You may have to reset it to  the significant part of the buffer.\n        You would normally use the C{command} property of \n        L{ShortCommand} or L{LongCommand} instead.\n        '
  159.         
  160.         def fget(self):
  161.             return self[16:]
  162.  
  163.         
  164.         def fset(self, buff):
  165.             self[16:] = buff
  166.             self.length = len(buff)
  167.  
  168.         return property(doc = doc, fget = fget, fset = fset)
  169.  
  170.     data = dynamic_property(data)
  171.     
  172.     def __init__(self, packet):
  173.         if ('__len__' in dir(packet) or len(packet) < 16 or '__len__' not in dir(packet)) and packet < 16:
  174.             raise PacketError(str(self.__class__)[7:-2] + ' packets must have length atleast 16')
  175.         packet < 16
  176.         TransferBuffer.__init__(self, packet)
  177.  
  178.  
  179.  
  180. class SetTime(Command):
  181.     NUMBER = 260
  182.     timezone = field(start = 16, fmt = DWORD)
  183.     year = field(start = 20, fmt = DWORD)
  184.     month = field(start = 24, fmt = DWORD)
  185.     day = field(start = 28, fmt = DWORD)
  186.     hour = field(start = 32, fmt = DWORD)
  187.     minute = field(start = 36, fmt = DWORD)
  188.     second = field(start = 40, fmt = DWORD)
  189.     
  190.     def __init__(self, t = None):
  191.         self.number = SetTime.NUMBER
  192.         self.type = 1
  193.         self.length = 28
  194.         td = datetime.now() - datetime.utcnow()
  195.         tz = int((td.days * 24 * 3600 + td.seconds) / 60)
  196.         self.timezone = None if tz > 0 else 0x100000000L + tz
  197.         if not t:
  198.             t = time.time()
  199.         
  200.         t = time.gmtime(t)
  201.         self.year = t[0]
  202.         self.month = t[1]
  203.         self.day = t[2]
  204.         self.hour = t[3]
  205.         self.minute = t[4]
  206.         self.second = None if t[5] < 60 else 59
  207.  
  208.  
  209.  
  210. class ShortCommand(Command):
  211.     SIZE = 20
  212.     command = field(start = 16, fmt = DWORD)
  213.     
  214.     def __init__(self, number = 0, type = 0, command = 0):
  215.         Command.__init__(self, ShortCommand.SIZE)
  216.         self.number = number
  217.         self.type = type
  218.         self.length = 4
  219.         self.command = command
  220.  
  221.  
  222.  
  223. class DirRead(ShortCommand):
  224.     NUMBER = 53
  225.     
  226.     def __init__(self, _id):
  227.         ShortCommand.__init__(self, number = DirRead.NUMBER, type = 1, command = _id)
  228.  
  229.  
  230.  
  231. class DirClose(ShortCommand):
  232.     NUMBER = 52
  233.     
  234.     def __init__(self, _id):
  235.         ShortCommand.__init__(self, number = DirClose.NUMBER, type = 1, command = _id)
  236.  
  237.  
  238.  
  239. class BeginEndSession(ShortCommand):
  240.     NUMBER = 1
  241.     
  242.     def __init__(self, end = True):
  243.         command = None if end else 1
  244.         ShortCommand.__init__(self, number = BeginEndSession.NUMBER, type = 1, command = command)
  245.  
  246.  
  247.  
  248. class GetUSBProtocolVersion(ShortCommand):
  249.     NUMBER = 0
  250.     
  251.     def __init__(self):
  252.         ShortCommand.__init__(self, number = GetUSBProtocolVersion.NUMBER, type = 1, command = 0)
  253.  
  254.  
  255.  
  256. class SetBulkSize(Command):
  257.     NUMBER = 263
  258.     chunk_size = field(fmt = WORD, start = 16)
  259.     unknown = field(fmt = WORD, start = 18)
  260.     
  261.     def __init__(self, chunk_size = 32768, unknown = 2):
  262.         []([], [ 0 for i in range(24) ])
  263.         self.number = SetBulkSize.NUMBER
  264.         self.type = 1
  265.         self.chunk_size = chunk_size
  266.         self.unknown = unknown
  267.  
  268.  
  269.  
  270. class UnlockDevice(Command):
  271.     NUMBER = 262
  272.     key = stringfield(8, start = 16)
  273.     
  274.     def __init__(self, key = '-1\x00\x00\x00\x00\x00\x00'):
  275.         Command.__init__(self, 24)
  276.         self.number = UnlockDevice.NUMBER
  277.         self.type = 1
  278.         self.length = 8
  279.         self.key = key
  280.  
  281.  
  282.  
  283. class LongCommand(Command):
  284.     SIZE = 32
  285.     
  286.     def __init__(self, number = 0, type = 0, command = 0):
  287.         Command.__init__(self, LongCommand.SIZE)
  288.         self.number = number
  289.         self.type = type
  290.         self.length = 16
  291.         self.command = command
  292.  
  293.     
  294.     def command(self):
  295.         doc = ' \n        Usually carries extra information needed for the command\n        It is a list of C{unsigned integers} of length between 1 and 4. 4 \n        C{unsigned int} stored in 16 bytes at byte 16.\n        '
  296.         
  297.         def fget(self):
  298.             return self.unpack(start = 16, fmt = '<' + str(self.length / 4) + 'I')
  299.  
  300.         
  301.         def fset(self, val):
  302.             if '__len__' not in dir(val):
  303.                 val = (val,)
  304.             
  305.             start = 16
  306.             for command in val:
  307.                 self.pack(command, start = start, fmt = DWORD)
  308.                 start += struct.calcsize(DWORD)
  309.             
  310.  
  311.         return property(doc = doc, fget = fget, fset = fset)
  312.  
  313.     command = dynamic_property(command)
  314.  
  315.  
  316. class PathCommand(Command):
  317.     path_length = field(start = 16, fmt = DWORD)
  318.     path = stringfield(path_length, start = 20)
  319.     
  320.     def __init__(self, path, number, path_len_at_byte = 16):
  321.         Command.__init__(self, path_len_at_byte + 4 + len(path))
  322.         if isinstance(path, unicode):
  323.             path = path.encode('utf8')
  324.         
  325.         self.path_length = len(path)
  326.         self.path = path
  327.         self.type = 1
  328.         self.length = len(self) - 16
  329.         self.number = number
  330.  
  331.  
  332.  
  333. class TotalSpaceQuery(PathCommand):
  334.     NUMBER = 83
  335.     
  336.     def __init__(self, path):
  337.         PathCommand.__init__(self, path, TotalSpaceQuery.NUMBER)
  338.  
  339.  
  340.  
  341. class FreeSpaceQuery(ShortCommand):
  342.     NUMBER = 259
  343.     
  344.     def __init__(self, where):
  345.         c = 0
  346.         if where.startswith('a:'):
  347.             c = 1
  348.         elif where.startswith('b:'):
  349.             c = 2
  350.         
  351.         ShortCommand.__init__(self, number = FreeSpaceQuery.NUMBER, type = 1, command = c)
  352.  
  353.  
  354.  
  355. class DirCreate(PathCommand):
  356.     NUMBER = 48
  357.     
  358.     def __init__(self, path):
  359.         PathCommand.__init__(self, path, DirCreate.NUMBER)
  360.  
  361.  
  362.  
  363. class DirOpen(PathCommand):
  364.     NUMBER = 51
  365.     
  366.     def __init__(self, path):
  367.         PathCommand.__init__(self, path, DirOpen.NUMBER)
  368.  
  369.  
  370.  
  371. class AcknowledgeBulkRead(LongCommand):
  372.     
  373.     def __init__(self, bulk_read_id):
  374.         LongCommand.__init__(self, number = 4096, type = 0, command = bulk_read_id)
  375.  
  376.  
  377.  
  378. class DeviceInfoQuery(Command):
  379.     NUMBER = 257
  380.     
  381.     def __init__(self):
  382.         Command.__init__(self, 16)
  383.         self.number = DeviceInfoQuery.NUMBER
  384.         self.type = 1
  385.  
  386.  
  387.  
  388. class FileClose(ShortCommand):
  389.     NUMBER = 17
  390.     
  391.     def __init__(self, _id):
  392.         ShortCommand.__init__(self, number = FileClose.NUMBER, type = 1, command = _id)
  393.  
  394.  
  395.  
  396. class FileCreate(PathCommand):
  397.     NUMBER = 26
  398.     
  399.     def __init__(self, path):
  400.         PathCommand.__init__(self, path, FileCreate.NUMBER)
  401.  
  402.  
  403.  
  404. class FileDelete(PathCommand):
  405.     NUMBER = 27
  406.     
  407.     def __init__(self, path):
  408.         PathCommand.__init__(self, path, FileDelete.NUMBER)
  409.  
  410.  
  411.  
  412. class DirDelete(PathCommand):
  413.     NUMBER = 49
  414.     
  415.     def __init__(self, path):
  416.         PathCommand.__init__(self, path, DirDelete.NUMBER)
  417.  
  418.  
  419.  
  420. class FileOpen(PathCommand):
  421.     NUMBER = 16
  422.     READ = 0
  423.     WRITE = 1
  424.     path_length = field(start = 20, fmt = DWORD)
  425.     path = stringfield(path_length, start = 24)
  426.     
  427.     def __init__(self, path, mode = 0):
  428.         PathCommand.__init__(self, path, FileOpen.NUMBER, path_len_at_byte = 20)
  429.         self.mode = mode
  430.  
  431.     
  432.     def mode(self):
  433.         doc = ' \n                    The file open mode. Is either L{FileOpen.READ} \n                    or L{FileOpen.WRITE}. C{unsigned int} stored at byte 16. \n                    '
  434.         
  435.         def fget(self):
  436.             return self.unpack(start = 16, fmt = DWORD)[0]
  437.  
  438.         
  439.         def fset(self, val):
  440.             self.pack(val, start = 16, fmt = DWORD)
  441.  
  442.         return property(doc = doc, fget = fget, fset = fset)
  443.  
  444.     mode = dynamic_property(mode)
  445.  
  446.  
  447. class FileIO(Command):
  448.     RNUMBER = 22
  449.     WNUMBER = 23
  450.     id = field(start = 16, fmt = DWORD)
  451.     offset = field(start = 20, fmt = DDWORD)
  452.     size = field(start = 28, fmt = DWORD)
  453.     
  454.     def __init__(self, _id, offset, size, mode = 22):
  455.         Command.__init__(self, 32)
  456.         self.number = mode
  457.         self.type = 1
  458.         self.length = 16
  459.         self.id = _id
  460.         self.offset = offset
  461.         self.size = size
  462.  
  463.  
  464.  
  465. class PathQuery(PathCommand):
  466.     NUMBER = 24
  467.     
  468.     def __init__(self, path):
  469.         PathCommand.__init__(self, path, PathQuery.NUMBER)
  470.  
  471.  
  472.  
  473. class SetFileInfo(PathCommand):
  474.     NUMBER = 25
  475.     
  476.     def __init__(self, path):
  477.         PathCommand.__init__(self, path, SetFileInfo.NUMBER)
  478.  
  479.  
  480.  
  481. class Response(Command):
  482.     SIZE = 32
  483.     rnumber = field(start = 16, fmt = DWORD)
  484.     code = field(start = 20, fmt = DWORD)
  485.     data_size = field(start = 28, fmt = DWORD)
  486.     
  487.     def __init__(self, packet):
  488.         if len(packet) != Response.SIZE:
  489.             raise PacketError(str(self.__class__)[7:-2] + ' packets must have exactly ' + str(Response.SIZE) + ' bytes not ' + str(len(packet)))
  490.         len(packet) != Response.SIZE
  491.         Command.__init__(self, packet)
  492.         if self.number != 4096:
  493.             raise PacketError('Response packets must have their number set to ' + hex(4096))
  494.         self.number != 4096
  495.  
  496.     
  497.     def data(self):
  498.         doc = ' \n                  The last 3 DWORDs (12 bytes) of data in this \n                  response packet. Returned as a list of unsigned integers.\n                  '
  499.         
  500.         def fget(self):
  501.             return self.unpack(start = 20, fmt = '<III')
  502.  
  503.         
  504.         def fset(self, val):
  505.             self.pack(val, start = 20, fmt = '<III')
  506.  
  507.         return property(doc = doc, fget = fget, fset = fset)
  508.  
  509.     data = dynamic_property(data)
  510.  
  511.  
  512. class ListResponse(Response):
  513.     IS_FILE = 0xFFFFFFD2L
  514.     IS_INVALID = 0xFFFFFFF9L
  515.     IS_UNMOUNTED = 0xFFFFFFC8L
  516.     IS_EOL = 0xFFFFFFFAL
  517.     PATH_NOT_FOUND = 0xFFFFFFD7L
  518.     PERMISSION_DENIED = 0xFFFFFFD6L
  519.     
  520.     def is_file(self):
  521.         doc = ' True iff queried path is a file '
  522.         
  523.         def fget(self):
  524.             return self.code == ListResponse.IS_FILE
  525.  
  526.         return property(doc = doc, fget = fget)
  527.  
  528.     is_file = dynamic_property(is_file)
  529.     
  530.     def is_invalid(self):
  531.         doc = ' True iff queried path is invalid '
  532.         
  533.         def fget(self):
  534.             return self.code == ListResponse.IS_INVALID
  535.  
  536.         return property(doc = doc, fget = fget)
  537.  
  538.     is_invalid = dynamic_property(is_invalid)
  539.     
  540.     def path_not_found(self):
  541.         doc = ' True iff queried path is not found '
  542.         
  543.         def fget(self):
  544.             return self.code == ListResponse.PATH_NOT_FOUND
  545.  
  546.         return property(doc = doc, fget = fget)
  547.  
  548.     path_not_found = dynamic_property(path_not_found)
  549.     
  550.     def permission_denied(self):
  551.         doc = ' True iff permission is denied for path operations '
  552.         
  553.         def fget(self):
  554.             return self.code == ListResponse.PERMISSION_DENIED
  555.  
  556.         return property(doc = doc, fget = fget)
  557.  
  558.     permission_denied = dynamic_property(permission_denied)
  559.     
  560.     def is_unmounted(self):
  561.         doc = ' True iff queried path is unmounted (i.e. removed storage card) '
  562.         
  563.         def fget(self):
  564.             return self.code == ListResponse.IS_UNMOUNTED
  565.  
  566.         return property(doc = doc, fget = fget)
  567.  
  568.     is_unmounted = dynamic_property(is_unmounted)
  569.     
  570.     def is_eol(self):
  571.         doc = ' True iff there are no more items in the list '
  572.         
  573.         def fget(self):
  574.             return self.code == ListResponse.IS_EOL
  575.  
  576.         return property(doc = doc, fget = fget)
  577.  
  578.     is_eol = dynamic_property(is_eol)
  579.  
  580.  
  581. class Answer(TransferBuffer):
  582.     number = field(start = 0, fmt = DWORD)
  583.     length = field(start = 12, fmt = DWORD)
  584.     
  585.     def __init__(self, packet):
  586.         if '__len__' in dir(packet):
  587.             if len(packet) < 16:
  588.                 raise PacketError(str(self.__class__)[7:-2] + ' packets must have a length of atleast 16 bytes. Got initializer of ' + str(len(packet)) + ' bytes.')
  589.             len(packet) < 16
  590.         elif packet < 16:
  591.             raise PacketError(str(self.__class__)[7:-2] + ' packets must have a length of atleast 16 bytes')
  592.         
  593.         TransferBuffer.__init__(self, packet)
  594.  
  595.  
  596.  
  597. class FileProperties(Answer):
  598.     file_size = field(start = 16, fmt = DDWORD)
  599.     file_type = field(start = 24, fmt = DWORD)
  600.     ctime = field(start = 28, fmt = DWORD)
  601.     wtime = field(start = 32, fmt = DWORD)
  602.     permissions = field(start = 36, fmt = DWORD)
  603.     
  604.     def is_dir(self):
  605.         doc = 'True if path points to a directory, False if it points to a file.'
  606.         
  607.         def fget(self):
  608.             return self.file_type == 2
  609.  
  610.         
  611.         def fset(self, val):
  612.             if val:
  613.                 val = 2
  614.             else:
  615.                 val = 1
  616.             self.file_type = val
  617.  
  618.         return property(doc = doc, fget = fget, fset = fset)
  619.  
  620.     is_dir = dynamic_property(is_dir)
  621.     
  622.     def is_readonly(self):
  623.         doc = ' Whether this file is readonly.'
  624.         
  625.         def fget(self):
  626.             return self.unpack(start = 36, fmt = DWORD)[0] != 0
  627.  
  628.         
  629.         def fset(self, val):
  630.             if val:
  631.                 val = 4
  632.             else:
  633.                 val = 0
  634.             self.pack(val, start = 36, fmt = DWORD)
  635.  
  636.         return property(doc = doc, fget = fget, fset = fset)
  637.  
  638.     is_readonly = dynamic_property(is_readonly)
  639.  
  640.  
  641. class USBProtocolVersion(Answer):
  642.     version = field(start = 16, fmt = DDWORD)
  643.  
  644.  
  645. class IdAnswer(Answer):
  646.     
  647.     def id(self):
  648.         doc = ' \n        The identifier. C{unsigned int} stored in 4 bytes \n        at byte 16. Should be sent in commands asking \n        for the next item in the list. \n        '
  649.         
  650.         def fget(self):
  651.             return self.unpack(start = 16, fmt = DWORD)[0]
  652.  
  653.         
  654.         def fset(self, val):
  655.             self.pack(val, start = 16, fmt = DWORD)
  656.  
  657.         return property(doc = doc, fget = fget, fset = fset)
  658.  
  659.     id = dynamic_property(id)
  660.  
  661.  
  662. class DeviceInfo(Answer):
  663.     device_name = field(start = 16, fmt = '<32s')
  664.     device_version = field(start = 48, fmt = '<32s')
  665.     software_version = field(start = 80, fmt = '<24s')
  666.     mime_type = field(start = 104, fmt = '<32s')
  667.  
  668.  
  669. class TotalSpaceAnswer(Answer):
  670.     total = field(start = 24, fmt = DDWORD)
  671.     free_space = field(start = 32, fmt = DDWORD)
  672.  
  673.  
  674. class FreeSpaceAnswer(Answer):
  675.     SIZE = 24
  676.     free = field(start = 16, fmt = DDWORD)
  677.  
  678.  
  679. class ListAnswer(Answer):
  680.     name_length = field(start = 20, fmt = DWORD)
  681.     name = stringfield(name_length, start = 24)
  682.     
  683.     def is_dir(self):
  684.         doc = ' \n        True if list item points to a directory, False if it points to a file.\n        C{unsigned int} stored in 4 bytes at byte 16.\n        '
  685.         
  686.         def fget(self):
  687.             return self.unpack(start = 16, fmt = DWORD)[0] == 2
  688.  
  689.         
  690.         def fset(self, val):
  691.             if val:
  692.                 val = 2
  693.             else:
  694.                 val = 1
  695.             self.pack(val, start = 16, fmt = DWORD)
  696.  
  697.         return property(doc = doc, fget = fget, fset = fset)
  698.  
  699.     is_dir = dynamic_property(is_dir)
  700.  
  701.