50)return!1;if(a.type===i.default.OPEN_PAREN)r++;else if(a.type===i.default.CLOSE_PAREN&&0===--r)return!0;if(this.isForbiddenToken(a))return!1}return!1},t.prototype.isForbiddenToken=function(t){var e=t.type,n=t.value;return e===i.default.RESERVED_TOPLEVEL||e===i.default.RESERVED_NEWLINE||e===i.default.COMMENT||e===i.default.BLOCK_COMMENT||";"===n},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.params=e,this.index=0}return t.prototype.get=function(t){var e=t.key,n=t.value;return this.params?e?this.params[e]:this.params[this.index++]:n},t}();e.default=r,t.exports=e.default},function(t,e,n){var r=n(75),o=n(77),i=n(45),a=n(9),s=n(41),c=n(46),u=n(76),l=n(47),f="[object Map]",p="[object Set]",d=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||c(t)||l(t)||i(t)))return!t.length;var e=o(t);if(e==f||e==p)return!t.size;if(u(t))return!r(t).length;for(var n in t)if(d.call(t,n))return!1;return!0}},function(t,e,n){var r=n(199)(Object.keys,Object);t.exports=r},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){var r=n(12)(n(8),"DataView");t.exports=r},function(t,e,n){var r=n(74),o=n(202),i=n(20),a=n(78),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,f=u.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(203),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(8)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(12)(n(8),"Promise");t.exports=r},function(t,e,n){var r=n(12)(n(8),"WeakMap");t.exports=r},function(t,e,n){var r=n(18),o=n(19),i="[object Arguments]";t.exports=function(t){return o(t)&&r(t)==i}},function(t,e){t.exports=function(){return!1}},function(t,e,n){var r=n(18),o=n(42),i=n(19),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[r(t)]}},function(t,e){t.exports=function(t){return function(e){return t(e)}}},function(t,e,n){(function(t){var r=n(71),o=e&&!e.nodeType&&e,i=o&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===o&&r.process,s=function(){try{var t=i&&i.require&&i.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=s}).call(this,n(22)(t))},function(t,e,n){var r=n(17),o=/[\\^$.*+?()[\]{}|]/g,i=RegExp(o.source);t.exports=function(t){return(t=r(t))&&i.test(t)?t.replace(o,"\\$&"):t}},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(25)),o=i(n(26));function i(t){return t&&t.__esModule?t:{default:t}}var a=["ALL","ALTER","ANALYZE","AND","ANY","ARRAY","AS","ASC","BEGIN","BETWEEN","BINARY","BOOLEAN","BREAK","BUCKET","BUILD","BY","CALL","CASE","CAST","CLUSTER","COLLATE","COLLECTION","COMMIT","CONNECT","CONTINUE","CORRELATE","COVER","CREATE","DATABASE","DATASET","DATASTORE","DECLARE","DECREMENT","DELETE","DERIVED","DESC","DESCRIBE","DISTINCT","DO","DROP","EACH","ELEMENT","ELSE","END","EVERY","EXCEPT","EXCLUDE","EXECUTE","EXISTS","EXPLAIN","FALSE","FETCH","FIRST","FLATTEN","FOR","FORCE","FROM","FUNCTION","GRANT","GROUP","GSI","HAVING","IF","IGNORE","ILIKE","IN","INCLUDE","INCREMENT","INDEX","INFER","INLINE","INNER","INSERT","INTERSECT","INTO","IS","JOIN","KEY","KEYS","KEYSPACE","KNOWN","LAST","LEFT","LET","LETTING","LIKE","LIMIT","LSM","MAP","MAPPING","MATCHED","MATERIALIZED","MERGE","MINUS","MISSING","NAMESPACE","NEST","NOT","NULL","NUMBER","OBJECT","OFFSET","ON","OPTION","OR","ORDER","OUTER","OVER","PARSE","PARTITION","PASSWORD","PATH","POOL","PREPARE","PRIMARY","PRIVATE","PRIVILEGE","PROCEDURE","PUBLIC","RAW","REALM","REDUCE","RENAME","RETURN","RETURNING","REVOKE","RIGHT","ROLE","ROLLBACK","SATISFIES","SCHEMA","SELECT","SELF","SEMI","SET","SHOW","SOME","START","STATISTICS","STRING","SYSTEM","THEN","TO","TRANSACTION","TRIGGER","TRUE","TRUNCATE","UNDER","UNION","UNIQUE","UNKNOWN","UNNEST","UNSET","UPDATE","UPSERT","USE","USER","USING","VALIDATE","VALUE","VALUED","VALUES","VIA","VIEW","WHEN","WHERE","WHILE","WITH","WITHIN","WORK","XOR"],s=["DELETE FROM","EXCEPT ALL","EXCEPT","EXPLAIN DELETE FROM","EXPLAIN UPDATE","EXPLAIN UPSERT","FROM","GROUP BY","HAVING","INFER","INSERT INTO","INTERSECT ALL","INTERSECT","LET","LIMIT","MERGE","NEST","ORDER BY","PREPARE","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNION ALL","UNION","UNNEST","UPDATE","UPSERT","USE KEYS","VALUES","WHERE"],c=["AND","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"''","``"],openParens:["(","[","{"],closeParens:[")","]","}"],namedPlaceholderTypes:["$"],lineCommentTypes:["#","--"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(25)),o=i(n(26));function i(t){return t&&t.__esModule?t:{default:t}}var a=["A","ACCESSIBLE","AGENT","AGGREGATE","ALL","ALTER","ANY","ARRAY","AS","ASC","AT","ATTRIBUTE","AUTHID","AVG","BETWEEN","BFILE_BASE","BINARY_INTEGER","BINARY","BLOB_BASE","BLOCK","BODY","BOOLEAN","BOTH","BOUND","BULK","BY","BYTE","C","CALL","CALLING","CASCADE","CASE","CHAR_BASE","CHAR","CHARACTER","CHARSET","CHARSETFORM","CHARSETID","CHECK","CLOB_BASE","CLONE","CLOSE","CLUSTER","CLUSTERS","COALESCE","COLAUTH","COLLECT","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPILED","COMPRESS","CONNECT","CONSTANT","CONSTRUCTOR","CONTEXT","CONTINUE","CONVERT","COUNT","CRASH","CREATE","CREDENTIAL","CURRENT","CURRVAL","CURSOR","CUSTOMDATUM","DANGLING","DATA","DATE_BASE","DATE","DAY","DECIMAL","DEFAULT","DEFINE","DELETE","DESC","DETERMINISTIC","DIRECTORY","DISTINCT","DO","DOUBLE","DROP","DURATION","ELEMENT","ELSIF","EMPTY","ESCAPE","EXCEPTIONS","EXCLUSIVE","EXECUTE","EXISTS","EXIT","EXTENDS","EXTERNAL","EXTRACT","FALSE","FETCH","FINAL","FIRST","FIXED","FLOAT","FOR","FORALL","FORCE","FROM","FUNCTION","GENERAL","GOTO","GRANT","GROUP","HASH","HEAP","HIDDEN","HOUR","IDENTIFIED","IF","IMMEDIATE","IN","INCLUDING","INDEX","INDEXES","INDICATOR","INDICES","INFINITE","INSTANTIABLE","INT","INTEGER","INTERFACE","INTERVAL","INTO","INVALIDATE","IS","ISOLATION","JAVA","LANGUAGE","LARGE","LEADING","LENGTH","LEVEL","LIBRARY","LIKE","LIKE2","LIKE4","LIKEC","LIMITED","LOCAL","LOCK","LONG","MAP","MAX","MAXLEN","MEMBER","MERGE","MIN","MINUS","MINUTE","MLSLABEL","MOD","MODE","MONTH","MULTISET","NAME","NAN","NATIONAL","NATIVE","NATURAL","NATURALN","NCHAR","NEW","NEXTVAL","NOCOMPRESS","NOCOPY","NOT","NOWAIT","NULL","NULLIF","NUMBER_BASE","NUMBER","OBJECT","OCICOLL","OCIDATE","OCIDATETIME","OCIDURATION","OCIINTERVAL","OCILOBLOCATOR","OCINUMBER","OCIRAW","OCIREF","OCIREFCURSOR","OCIROWID","OCISTRING","OCITYPE","OF","OLD","ON","ONLY","OPAQUE","OPEN","OPERATOR","OPTION","ORACLE","ORADATA","ORDER","ORGANIZATION","ORLANY","ORLVARY","OTHERS","OUT","OVERLAPS","OVERRIDING","PACKAGE","PARALLEL_ENABLE","PARAMETER","PARAMETERS","PARENT","PARTITION","PASCAL","PCTFREE","PIPE","PIPELINED","PLS_INTEGER","PLUGGABLE","POSITIVE","POSITIVEN","PRAGMA","PRECISION","PRIOR","PRIVATE","PROCEDURE","PUBLIC","RAISE","RANGE","RAW","READ","REAL","RECORD","REF","REFERENCE","RELEASE","RELIES_ON","REM","REMAINDER","RENAME","RESOURCE","RESULT_CACHE","RESULT","RETURN","RETURNING","REVERSE","REVOKE","ROLLBACK","ROW","ROWID","ROWNUM","ROWTYPE","SAMPLE","SAVE","SAVEPOINT","SB1","SB2","SB4","SECOND","SEGMENT","SELF","SEPARATE","SEQUENCE","SERIALIZABLE","SHARE","SHORT","SIZE_T","SIZE","SMALLINT","SOME","SPACE","SPARSE","SQL","SQLCODE","SQLDATA","SQLERRM","SQLNAME","SQLSTATE","STANDARD","START","STATIC","STDDEV","STORED","STRING","STRUCT","STYLE","SUBMULTISET","SUBPARTITION","SUBSTITUTABLE","SUBTYPE","SUCCESSFUL","SUM","SYNONYM","SYSDATE","TABAUTH","TABLE","TDO","THE","THEN","TIME","TIMESTAMP","TIMEZONE_ABBR","TIMEZONE_HOUR","TIMEZONE_MINUTE","TIMEZONE_REGION","TO","TRAILING","TRANSACTION","TRANSACTIONAL","TRIGGER","TRUE","TRUSTED","TYPE","UB1","UB2","UB4","UID","UNDER","UNIQUE","UNPLUG","UNSIGNED","UNTRUSTED","USE","USER","USING","VALIDATE","VALIST","VALUE","VARCHAR","VARCHAR2","VARIABLE","VARIANCE","VARRAY","VARYING","VIEW","VIEWS","VOID","WHENEVER","WHILE","WITH","WORK","WRAPPED","WRITE","YEAR","ZONE"],s=["ADD","ALTER COLUMN","ALTER TABLE","BEGIN","CONNECT BY","DECLARE","DELETE FROM","DELETE","END","EXCEPT","EXCEPTION","FETCH FIRST","FROM","GROUP BY","HAVING","INSERT INTO","INSERT","INTERSECT","LIMIT","LOOP","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","START WITH","UNION ALL","UNION","UPDATE","VALUES","WHERE"],c=["AND","CROSS APPLY","CROSS JOIN","ELSE","END","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"N''","''","``"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:[":"],lineCommentTypes:["--"],specialWordChars:["_","$","#",".","@"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(25)),o=i(n(26));function i(t){return t&&t.__esModule?t:{default:t}}var a=["ACCESSIBLE","ACTION","AGAINST","AGGREGATE","ALGORITHM","ALL","ALTER","ANALYSE","ANALYZE","AS","ASC","AUTOCOMMIT","AUTO_INCREMENT","BACKUP","BEGIN","BETWEEN","BINLOG","BOTH","CASCADE","CASE","CHANGE","CHANGED","CHARACTER SET","CHARSET","CHECK","CHECKSUM","COLLATE","COLLATION","COLUMN","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPRESSED","CONCURRENT","CONSTRAINT","CONTAINS","CONVERT","CREATE","CROSS","CURRENT_TIMESTAMP","DATABASE","DATABASES","DAY","DAY_HOUR","DAY_MINUTE","DAY_SECOND","DEFAULT","DEFINER","DELAYED","DELETE","DESC","DESCRIBE","DETERMINISTIC","DISTINCT","DISTINCTROW","DIV","DO","DROP","DUMPFILE","DUPLICATE","DYNAMIC","ELSE","ENCLOSED","END","ENGINE","ENGINES","ENGINE_TYPE","ESCAPE","ESCAPED","EVENTS","EXEC","EXECUTE","EXISTS","EXPLAIN","EXTENDED","FAST","FETCH","FIELDS","FILE","FIRST","FIXED","FLUSH","FOR","FORCE","FOREIGN","FULL","FULLTEXT","FUNCTION","GLOBAL","GRANT","GRANTS","GROUP_CONCAT","HEAP","HIGH_PRIORITY","HOSTS","HOUR","HOUR_MINUTE","HOUR_SECOND","IDENTIFIED","IF","IFNULL","IGNORE","IN","INDEX","INDEXES","INFILE","INSERT","INSERT_ID","INSERT_METHOD","INTERVAL","INTO","INVOKER","IS","ISOLATION","KEY","KEYS","KILL","LAST_INSERT_ID","LEADING","LEVEL","LIKE","LINEAR","LINES","LOAD","LOCAL","LOCK","LOCKS","LOGS","LOW_PRIORITY","MARIA","MASTER","MASTER_CONNECT_RETRY","MASTER_HOST","MASTER_LOG_FILE","MATCH","MAX_CONNECTIONS_PER_HOUR","MAX_QUERIES_PER_HOUR","MAX_ROWS","MAX_UPDATES_PER_HOUR","MAX_USER_CONNECTIONS","MEDIUM","MERGE","MINUTE","MINUTE_SECOND","MIN_ROWS","MODE","MODIFY","MONTH","MRG_MYISAM","MYISAM","NAMES","NATURAL","NOT","NOW()","NULL","OFFSET","ON DELETE","ON UPDATE","ON","ONLY","OPEN","OPTIMIZE","OPTION","OPTIONALLY","OUTFILE","PACK_KEYS","PAGE","PARTIAL","PARTITION","PARTITIONS","PASSWORD","PRIMARY","PRIVILEGES","PROCEDURE","PROCESS","PROCESSLIST","PURGE","QUICK","RAID0","RAID_CHUNKS","RAID_CHUNKSIZE","RAID_TYPE","RANGE","READ","READ_ONLY","READ_WRITE","REFERENCES","REGEXP","RELOAD","RENAME","REPAIR","REPEATABLE","REPLACE","REPLICATION","RESET","RESTORE","RESTRICT","RETURN","RETURNS","REVOKE","RLIKE","ROLLBACK","ROW","ROWS","ROW_FORMAT","SECOND","SECURITY","SEPARATOR","SERIALIZABLE","SESSION","SHARE","SHOW","SHUTDOWN","SLAVE","SONAME","SOUNDS","SQL","SQL_AUTO_IS_NULL","SQL_BIG_RESULT","SQL_BIG_SELECTS","SQL_BIG_TABLES","SQL_BUFFER_RESULT","SQL_CACHE","SQL_CALC_FOUND_ROWS","SQL_LOG_BIN","SQL_LOG_OFF","SQL_LOG_UPDATE","SQL_LOW_PRIORITY_UPDATES","SQL_MAX_JOIN_SIZE","SQL_NO_CACHE","SQL_QUOTE_SHOW_CREATE","SQL_SAFE_UPDATES","SQL_SELECT_LIMIT","SQL_SLAVE_SKIP_COUNTER","SQL_SMALL_RESULT","SQL_WARNINGS","START","STARTING","STATUS","STOP","STORAGE","STRAIGHT_JOIN","STRING","STRIPED","SUPER","TABLE","TABLES","TEMPORARY","TERMINATED","THEN","TO","TRAILING","TRANSACTIONAL","TRUE","TRUNCATE","TYPE","TYPES","UNCOMMITTED","UNIQUE","UNLOCK","UNSIGNED","USAGE","USE","USING","VARIABLES","VIEW","WHEN","WITH","WORK","WRITE","YEAR_MONTH"],s=["ADD","AFTER","ALTER COLUMN","ALTER TABLE","DELETE FROM","EXCEPT","FETCH FIRST","FROM","GROUP BY","GO","HAVING","INSERT INTO","INSERT","INTERSECT","LIMIT","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNION ALL","UNION","UPDATE","VALUES","WHERE"],c=["AND","CROSS APPLY","CROSS JOIN","ELSE","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"N''","''","``","[]"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:["@",":"],lineCommentTypes:["#","--"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e){t.exports=function(t){const e={className:"variable",begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*(?![A-Za-z0-9])(?![$])"},n={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},r={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},o=t.inherit(t.APOS_STRING_MODE,{illegal:null}),i=t.inherit(t.QUOTE_STRING_MODE,{illegal:null,contains:t.QUOTE_STRING_MODE.contains.concat(r)}),a=t.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,contains:t.QUOTE_STRING_MODE.contains.concat(r)}),s={className:"string",contains:[t.BACKSLASH_ESCAPE,n],variants:[t.inherit(o,{begin:"b'",end:"'"}),t.inherit(i,{begin:'b"',end:'"'}),i,o,a]},c={variants:[t.BINARY_NUMBER_MODE,t.C_NUMBER_MODE]},u={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7","php8"],case_insensitive:!0,keywords:u,contains:[t.HASH_COMMENT_MODE,t.COMMENT("//","$",{contains:[n]}),t.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),t.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),n,{className:"keyword",begin:/\$this\b/},e,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[t.UNDERSCORE_TITLE_MODE,{begin:"=>"},{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:u,contains:["self",e,t.C_BLOCK_COMMENT_MODE,s,c]}]},{className:"class",beginKeywords:"class interface",relevance:0,end:/\{/,excludeEnd:!0,illegal:/[:($"]/,contains:[{beginKeywords:"extends implements"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";",contains:[t.UNDERSCORE_TITLE_MODE]},s,c]}}},function(t,e,n){var r=n(80),o=n(237),i=n(238),a=n(81),s=n(239),c=n(49),u=200;t.exports=function(t,e,n){var l=-1,f=o,p=t.length,d=!0,h=[],g=h;if(n)d=!1,f=i;else if(p>=u){var m=e?null:s(t);if(m)return c(m);d=!1,f=a,g=new r}else g=e?[]:h;t:for(;++l-1}},function(t,e,n){var r=n(29);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(30);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(30);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(30);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(30);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},function(t,e){var n="__lodash_hash_undefined__";t.exports=function(t){return this.__data__.set(t,n),this}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(72);t.exports=function(t,e){return!!(null==t?0:t.length)&&r(t,e,0)>-1}},function(t,e){t.exports=function(t,e,n){for(var r=-1,o=null==t?0:t.length;++r>>32-e},rotr:function(t,e){return t<<32-e|t>>>e},endian:function(t){if(t.constructor==Number)return 16711935&r.rotl(t,8)|4278255360&r.rotl(t,24);for(var e=0;e0;t--)e.push(Math.floor(256*Math.random()));return e},bytesToWords:function(t){for(var e=[],n=0,r=0;n>>5]|=t[n]<<24-r%32;return e},wordsToBytes:function(t){for(var e=[],n=0;n<32*t.length;n+=8)e.push(t[n>>>5]>>>24-n%32&255);return e},bytesToHex:function(t){for(var e=[],n=0;n>>4).toString(16)),e.push((15&t[n]).toString(16));return e.join("")},hexToBytes:function(t){for(var e=[],n=0;n>>6*(3-i)&63)):e.push("=");return e.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/gi,"");for(var e=[],r=0,o=0;r>>6-2*o);return e}},t.exports=r},function(t,e){function n(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}
-/*!
- * Determine if an object is a Buffer
- *
- * @author Feross Aboukhadijeh
- * @license MIT
- */
-t.exports=function(t){return null!=t&&(n(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&n(t.slice(0,0))}(t)||!!t._isBuffer)}},function(t,e,n){"use strict";n.r(e);n(94);var r,o,i,a=n(6),s=n.n(a),c=n(32),u=n.n(c),l=n(33),f=n.n(l),p=n(7),d=n(0),h=Object(d.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("svg",{staticStyle:{display:"none"},attrs:{xmlns:"http://www.w3.org/2000/svg"}},[e("symbol",{attrs:{id:"arrow-down-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[e("path",{attrs:{d:"M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z"}})]),this._v(" "),e("symbol",{attrs:{id:"arrow-up-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[e("path",{attrs:{d:"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z"}})]),this._v(" "),e("symbol",{attrs:{id:"clipboard-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512"}},[e("path",{attrs:{d:"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z"}})]),this._v(" "),e("symbol",{attrs:{id:"lightbulb-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 352 512"}},[e("path",{attrs:{d:"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z"}})]),this._v(" "),e("symbol",{attrs:{id:"pencil-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"}})]),this._v(" "),e("symbol",{attrs:{id:"plus-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z"}})]),this._v(" "),e("symbol",{attrs:{id:"share-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z"}})])])}),[],!1,null,null,null).exports,g=n(5),m={inject:["config"],props:["text"]},v=Object(d.a)(m,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"mt-12 card card-has-header card-no-props"},[e("div",{staticClass:"card-details card-danger"},[e("div",{staticClass:"card-details-overflow scrollbar p-4"},[e("div",{staticClass:"text-xl"},[this._t("default")],2)])])])}),[],!1,null,null,null).exports,b=n(14),_={props:{name:{required:!0}},data:function(){return{fullException:!1}},methods:{removeClamp:function(){this.fullException||(this.fullException=!0)}}},y=Object(d.a)(_,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"ui-exception-message",class:this.fullException?"ui-exception-message-full":"",on:{mousedown:this.removeClamp}},[this._v("\n "+this._s(this.name)+"\n")])}),[],!1,null,null,null).exports,E={components:{ExceptionClass:n(15).a,ExceptionMessage:y,LineNumber:b.a,FilePath:g.a},inject:["report"],computed:{firstFrame:function(){return this.report.stacktrace[0]}}},x={inject:["report","telescopeUrl","config"],components:{OccurrenceDetails:Object(d.a)(E,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"card-details-overflow scrollbar p-12 pt-10"},[n("div",{staticClass:"text-2xl"},[n("ExceptionClass",{attrs:{name:t.report.exception_class}}),t._v(" "),n("ExceptionMessage",{attrs:{name:t.report.message}})],1),t._v(" "),n("div",[n("a",{staticClass:"ui-url",attrs:{href:t.report.context.request.url,target:"_blank"}},[t._v("\n "+t._s(t.report.context.request.url)+"\n ")])])])}),[],!1,null,null,null).exports,FilePath:g.a}},k=Object(d.a)(x,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"mt-12 card card-has-header card-no-props"},[n("div",{staticClass:"card-header"},[n("div",{staticClass:"grid items-center rounded-t border-b border-tint-300 text-xs text-tint-600 ",staticStyle:{"grid-template-columns":"1fr 1fr"}},[n("div",{staticClass:"grid cols-auto justify-start gap-2 px-4 py-2"},[n("div",{staticClass:"flex items-center"},[n("a",{attrs:{href:"http://flareapp.io/docs/ignition-for-laravel/introduction",target:"_blank",title:"Ignition docs"}},[n("svg",{staticClass:"w-4 h-5 mr-4",attrs:{viewBox:"0 0 428 988"}},[n("polygon",{staticStyle:{fill:"#FA4E79"},attrs:{points:"428,247.1 428,494.1 214,617.5 214,369.3 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#FFF082"},attrs:{points:"0,988 0,741 214,617.5 214,864.1 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#E6003A"},attrs:{points:"214,123.9 214,617.5 0,494.1 0,0 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#FFE100"},attrs:{points:"214,864.1 214,617.5 428,741 428,988 \t\t"}})])]),t._v(" "),n("FilePath",{attrs:{pathClass:"font-normal",file:t.report.application_path+t.config.directorySeparator,relative:!1}})],1)]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-end gap-4 px-4 py-2"},[t.telescopeUrl?n("div",[n("a",{staticClass:"link-dimmed sm:ml-6",attrs:{href:t.telescopeUrl,target:"_blank"}},[t._v("Telescope")])]):t._e()])])]),t._v(" "),n("div"),t._v(" "),n("div",{staticClass:"card-details"},[n("OccurrenceDetails")],1)])}),[],!1,null,null,null).exports,w=n(10),C=n.n(w),A=n(21),T=n.n(A),S=n(101)(),R=null,O={inject:["config"],props:{solution:{required:!0}},data:function(){return{isHidingSolutions:this.hasHideSolutionsCookie(),canExecuteSolutions:null,runningSolution:!1,executionSuccessful:null}},computed:{healthCheckEndpoint:function(){return this.solution.execute_endpoint.replace("execute-solution","health-check")}},created:function(){this.configureRunnableSolutions()},mounted:function(){this.isHidingSolutions&&this.$refs.solutionCard.classList.add("solution-hidden")},methods:{configureRunnableSolutions:function(){this.config.enableRunnableSolutions?this.checkExecutionEndpoint():this.canExecuteSolutions=!1},markdown:function(t){return S.render(t)},checkExecutionEndpoint:(o=T()(C.a.mark((function t(){var e;return C.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,fetch(this.healthCheckEndpoint);case 3:return t.next=5,t.sent.json();case 5:e=t.sent,this.canExecuteSolutions=e.can_execute_commands,t.next=12;break;case 9:t.prev=9,t.t0=t.catch(0),this.canExecuteSolutions=!1;case 12:case"end":return t.stop()}}),t,this,[[0,9]])}))),function(){return o.apply(this,arguments)}),execute:(r=T()(C.a.mark((function t(){var e;return C.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this.runningSolution){t.next=2;break}return t.abrupt("return");case 2:return t.prev=2,this.runningSolution=!0,t.next=6,fetch(this.solution.execute_endpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({solution:this.solution.class,parameters:this.solution.run_parameters})});case 6:e=t.sent,this.executionSuccessful=200===e.status,t.next=14;break;case 10:t.prev=10,t.t0=t.catch(2),console.error(t.t0),this.executionSuccessful=!1;case 14:return t.prev=14,this.runningSolution=!1,t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[2,10,14,17]])}))),function(){return r.apply(this,arguments)}),refresh:function(){location.reload()},getUrlLabel:function(t){var e=document.createElement("a");return e.href=t,e.hostname},toggleSolutions:function(){var t=this;this.isHidingSolutions?(window.clearTimeout(R),this.toggleHidingSolutions()):(this.$refs.solutionCard.classList.add("solution-hiding"),R=window.setTimeout((function(){t.$refs.solutionCard.classList.remove("solution-hiding"),t.toggleHidingSolutions()}),100))},toggleHidingSolutions:function(){if(this.isHidingSolutions)return document.cookie="".concat("hide_solutions","=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;"),void(this.isHidingSolutions=!1);var t=new Date;t.setTime(t.getTime()+31536e6),document.cookie="".concat("hide_solutions","=true;expires=").concat(t.toUTCString(),";path=/;"),this.isHidingSolutions=!0},hasHideSolutionsCookie:function(){return document.cookie.includes("hide_solutions")}}},N={components:{DangerCard:v,SolutionCard:Object(d.a)(O,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"solution-toggle",class:{"solution-toggle-show":t.isHidingSolutions},on:{click:t.toggleSolutions}},[t.isHidingSolutions?n("a",{staticClass:"link-solution",attrs:{target:"_blank"}},[n("Icon",{staticClass:"text-xs mr-1",attrs:{name:"lightbulb"}}),t._v(" Show solutions")],1):n("a",{staticClass:"link-solution",attrs:{target:"_blank"}},[t._v("Hide solutions")])]),t._v(" "),n("div",{ref:"solutionCard",staticClass:"solution",class:{"solution-hidden":t.isHidingSolutions}},[n("div",{staticClass:"solution-main"},[n("div",{staticClass:"solution-background mx-0"},[n("svg",{staticClass:"hidden absolute right-0 h-full | md:block",attrs:{x:"0px",y:"0px",viewBox:"0 0 299 452"}},[n("g",{staticStyle:{opacity:"0.075"}},[n("polygon",{staticStyle:{fill:"rgb(63,63,63)"},attrs:{points:"298.1,451.9 150.9,451.9 21,226.9 298.1,227.1"}}),t._v(" "),n("polygon",{staticStyle:{fill:"rgb(151,151,151)"},attrs:{points:"298.1,227.1 21,226.9 150.9,1.9 298.1,1.9"}})])])]),t._v(" "),n("div",{staticClass:"solution-content-wrapper scrollbar"},[n("div",{staticClass:"solution-content ml-0"},[""!==t.solution.title?n("h2",{staticClass:"solution-title"},[t._v("\n "+t._s(t.solution.title)+"\n ")]):t._e(),t._v(" "),t.solution.description?n("div",{staticClass:"solution-description",domProps:{innerHTML:t._s(t.markdown(t.solution.description))}}):t._e(),t._v(" "),t.solution.is_runnable?n("div",[n("p",{staticClass:"solution-description",domProps:{innerHTML:t._s(t.markdown(t.solution.action_description))}}),t._v(" "),null===t.canExecuteSolutions?n("p",{staticClass:"py-4 text-sm italic"},[t._v("\n Loading...\n ")]):t._e(),t._v(" "),n("div",{staticClass:"mt-4"},[t.solution.is_runnable&&!0===t.canExecuteSolutions&&null===t.executionSuccessful?n("button",{staticClass:"button-secondary button-lg bg-tint-300 hover:bg-tint-400",attrs:{disabled:t.runningSolution},on:{click:t.execute}},[t.runningSolution?n("span",[t._v("Running...")]):t._e(),t._v(" "),t.runningSolution?t._e():n("span",[t._v(t._s(t.solution.run_button_text))])]):t._e(),t._v(" "),t.executionSuccessful?n("p",[n("strong",{staticClass:"font-semibold"},[t._v("The solution was executed successfully.")]),t._v(" "),n("a",{staticClass:"link-solution",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.refresh(e)}}},[t._v("Refresh now.")])]):t._e(),t._v(" "),!1===t.executionSuccessful?n("p",[t._v("\n Something went wrong when executing the solution. Please try\n refreshing the page and try again.\n ")]):t._e()])]):t._e(),t._v(" "),Object.entries(t.solution.links).length>0?n("div",{staticClass:"mt-8 grid justify-start"},[n("div",{staticClass:"border-t-2 border-gray-700 opacity-25 "}),t._v(" "),n("div",{staticClass:"pt-2 grid cols-auto-1fr gapx-4 gapy-2 text-sm"},[n("label",{staticClass:"font-semibold uppercase tracking-wider"},[t._v("Read more")]),t._v(" "),n("ul",t._l(t.solution.links,(function(e,r){return n("li",{key:r},[n("a",{staticClass:"link-solution",attrs:{href:e,target:"_blank"}},[t._v(t._s(r))])])})),0)])]):t._e()])])])])])}),[],!1,null,null,null).exports,ErrorCard:k,FilePath:g.a},inject:["report","solutions","appEnv","appDebug"],data:function(){return{activeSolutionKey:0}},computed:{firstFrame:function(){return this.report.stacktrace[0]},solution:function(){return this.solutions[this.activeSolutionKey]}}},L=Object(d.a)(N,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"layout-col z-10"},["local"!==this.appEnv&&!0===this.appDebug?n("DangerCard",[n("p",[n("code",[t._v("APP_DEBUG")]),t._v(" is set to "),n("code",[t._v("true")]),t._v(" while "),n("code",[t._v("APP_ENV")]),t._v(" is\n not "),n("code",[t._v("local")])]),t._v(" "),n("p",{staticClass:"text-base"},[t._v("\n This could make your application vulnerable to remote execution.\n "),n("a",{staticClass:"underline",attrs:{target:"_blank",rel:"noopener",href:"https://flareapp.io/docs/ignition-for-laravel/security"}},[t._v("Read more about Ignition security.")])])]):t._e(),t._v(" "),n("ErrorCard")],1),t._v(" "),t.solutions.length>0?n("div",{staticClass:"layout-col z-1"},[n("SolutionCard",t._b({},"SolutionCard",{solution:t.solution},!1)),t._v(" "),t.solutions.length>1?n("div",{staticClass:"absolute left-0 bottom-0 w-full h-8 mb-2 px-4 text-sm z-10"},[n("ul",{staticClass:"grid cols-auto place-center gap-1"},t._l(t.solutions,(function(e,r){return n("li",{key:e.class,on:{click:function(e){t.activeSolutionKey=r}}},[n("a",{staticClass:"grid place-center h-8 min-w-8 px-2 rounded-full",class:{"bg-tint-200 font-semibold":t.activeSolutionKey===r,"hover:bg-tint-100 cursor-pointer":t.activeSolutionKey!==r}},[t._v("\n "+t._s(r+1)+"\n ")])])})),0)]):t._e()],1):t._e()])}),[],!1,null,null,null).exports,I=n(4),D=n.n(I),M={components:{CheckboxField:n(35).a},props:["error","isLoading"],computed:{selectedTabs:function(){return this.tabs.filter((function(t){return t.checked})).map((function(t){return t.name}))}},data:function(){return{tabs:[{label:"Stack trace",name:"stackTraceTab",checked:!0},{label:"Request",name:"requestTab",checked:!0},{label:"App",name:"appTab",checked:!0},{label:"User",name:"userTab",checked:!0},{label:"Context",name:"contextTab",checked:!0},{label:"Debug",name:"debugTab",checked:!0}]}},methods:{shareError:function(){this.isLoading||this.$emit("share",this.selectedTabs)}}},P=Object(d.a)(M,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"grid cols-2 justify-start gapx-6 gapy-2"},t._l(t.tabs,(function(e){return n("CheckboxField",{key:e.name,staticClass:"text-gray-200 hover:text-white",attrs:{label:e.label,name:e.name},on:{change:function(t){e.checked=!e.checked}},model:{value:e.checked,callback:function(n){t.$set(e,"checked",n)},expression:"tab.checked"}})})),1),t._v(" "),n("div",{staticClass:"mt-4"},[t.error?n("div",{staticClass:"mb-3"},[t._v("\n We were unable to share your error."),n("br"),t._v("\n Please try again later.\n ")]):t._e(),t._v(" "),n("button",{staticClass:"button-secondary button-sm text-white bg-tint-600",attrs:{disabled:t.isLoading},on:{click:t.shareError}},[t._v("\n "+t._s(t.isLoading?"Sharing…":"Share")+"\n ")])])])}),[],!1,null,null,null).exports,j={props:{text:{required:!0}},data:function(){return{copied:!1,timeout:!1}},methods:{copy:function(t){var e=this;this.timeout&&window.clearTimeout(this.timeout);var n=document.createElement("textarea");n.value=t,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),this.copied=!0,this.timeout=window.setTimeout((function(){return e.copied=!1}),3e3)}}},F={components:{CopyButton:Object(d.a)(j,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("button",{attrs:{title:"Copy to clipboard"},on:{click:function(e){return t.copy(t.text)}}},[n("Icon",{class:t.copied?"fill-green-300":"fill-gray-200 hover:fill-white",attrs:{name:"clipboard"}}),t._v(" "),t.copied?n("div",{staticClass:"ml-2 absolute top-0 left-full text-green-300"},[t._v("\n Copied!\n ")]):t._e()],1)}),[],!1,null,null,null).exports},props:{publicUrl:{required:!0},ownerUrl:{required:!0}}},U={components:{ShareLinks:Object(d.a)(F,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"text-left"},[n("p",{staticClass:"mt-2 text-gray-300"},[t._v("Share your error with others:")]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-start gap-2 mt-2"},[n("a",{staticClass:"button-secondary button-sm bg-tint-600 hover:bg-tint-700 text-white",attrs:{href:t.publicUrl,target:"_blank"}},[t._v("Open public share")]),t._v(" "),n("CopyButton",{attrs:{text:t.publicUrl}})],1),t._v(" "),n("p",{staticClass:"mt-4 text-gray-300"},[t._v("Administer your shared error here:")]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-start gap-2 mt-2"},[n("a",{staticClass:"button-secondary button-sm bg-tint-600 hover:bg-tint-700 text-white",attrs:{href:t.ownerUrl,target:"_blank"}},[t._v("Open share admin")]),t._v(" "),n("CopyButton",{attrs:{text:t.ownerUrl}})],1)])}),[],!1,null,null,null).exports,ShareForm:P},inject:["report","shareEndpoint"],data:function(){return{shareHadError:!1,sharedErrorUrls:null,menuVisible:!1,isShareLoading:!1}},watch:{menuVisible:function(t){t?window.addEventListener("click",this.toggleMenu):window.removeEventListener("click",this.toggleMenu)}},methods:{toggleMenu:function(){this.menuVisible=!this.menuVisible},shareError:(i=T()(C.a.mark((function t(e){var n,r;return C.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this.isShareLoading=!0,t.prev=1,t.next=4,fetch(this.shareEndpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({report:JSON.stringify(this.report),tabs:e,lineSelection:window.location.hash})});case 4:return n=t.sent,t.next=7,n.json();case 7:r=t.sent,n.ok?this.sharedErrorUrls=r:this.shareHadError=!0,t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),this.shareHadError=!0;case 14:this.isShareLoading=!1;case 15:case"end":return t.stop()}}),t,this,[[1,11]])}))),function(t){return i.apply(this,arguments)})}},$={inject:["config","report"],components:{ShareButton:Object(d.a)(U,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{on:{click:function(t){t.stopPropagation()}}},[n("button",{staticClass:"tab",class:t.menuVisible?"tab-active":"",on:{click:t.toggleMenu}},[t._v("\n Share\n "),n("Icon",{staticClass:"ml-2",attrs:{name:"share"}})],1),t._v(" "),n("div",{staticClass:"dropdown z-10 right-0 top-full p-4 overflow-visible",class:{hidden:!t.menuVisible},staticStyle:{"min-width":"18rem","margin-right":"-1px"},on:{click:function(t){t.stopPropagation()}}},[n("div",{staticClass:"flex items-center mb-4"},[n("svg",{staticClass:"w-4 h-5 mr-2",attrs:{viewBox:"0 0 682 1024"}},[n("polygon",{staticStyle:{fill:"#51DB9E"},attrs:{points:"235.3,510.5 21.5,387 21.5,140.2 236.5,264.1 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#7900F5"},attrs:{points:"235.3,1004.8 21.5,881.4 21.5,634.5 234.8,757.9 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#94F2C8"},attrs:{points:"448.9,386.9 21.5,140.2 235.3,16.7 663.2,263.4 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#A475F4"},attrs:{points:"234.8,757.9 21.5,634.5 235.3,511 449.1,634.5 "}})]),t._v(" "),n("h5",{staticClass:"text-left font-semibold uppercase tracking-wider whitespace-no-wrap"},[t._v("\n "+t._s(t.sharedErrorUrls?"Shared":"Share")+" on Flare\n ")]),t._v(" "),n("a",{staticClass:"ml-auto underline",attrs:{target:"_blank",href:"https://flareapp.io/docs/ignition-for-laravel/sharing-errors",title:"Flare documentation"}},[t._v("Docs\n ")])]),t._v(" "),t.sharedErrorUrls?n("div",[n("ShareLinks",{attrs:{publicUrl:t.sharedErrorUrls.public_url,ownerUrl:t.sharedErrorUrls.owner_url}})],1):n("ShareForm",{attrs:{error:t.shareHadError,"is-loading":t.isShareLoading},on:{share:t.shareError}})],1)])}),[],!1,null,null,null).exports},props:{value:{required:!0},customTabs:{required:!0}},data:function(){return{defaultTabs:[{component:"StackTab",title:"Stack trace"},{component:"RequestTab",title:"Request"}].concat(D()(this.report.context.livewire?[{component:"LivewireTab",title:"Livewire"}]:[]),[{component:"AppTab",title:"App"},{component:"UserTab",title:"User"},{component:"ContextTab",title:"Context"},{component:"DebugTab",title:"Debug"}]),shareButtonEnabled:this.config.enableShareButton}},mounted:function(){this.applyDefaultTabProps(),this.$emit("input",this.tabs[this.currentTabIndex])},computed:{currentTabIndex:function(){var t=this;return this.tabs.findIndex((function(e){return e.component===t.value.component}))},nextTab:function(){return this.tabs[this.currentTabIndex+1]||this.tabs[0]},previousTab:function(){return this.tabs[this.currentTabIndex-1]||this.tabs[this.tabs.length-1]},tabs:function(){var t={};return this.defaultTabs.forEach((function(e){t[e.component]=e})),this.customTabs.forEach((function(e){t[e.component]=e})),Object.values(t)}},methods:{applyDefaultTabProps:function(){var t=this;this.defaultTabs.map((function(e){return e.component===t.value.component&&(e.props=t.value.props||{}),e}))}}},B={props:{tab:{required:!0}},render:function(t){return t(this.tab.component,{props:this.tab.props||{}})}},z={props:{report:{required:!0},config:{required:!0},solutions:{required:!0},telescopeUrl:{required:!0},shareEndpoint:{required:!0},defaultTab:{required:!0},defaultTabProps:{required:!1},appEnv:{required:!0},appDebug:{required:!0}},data:function(){return{customTabs:window.tabs,tab:{component:this.defaultTab,props:this.defaultTabProps||{}}}},provide:function(){return{config:this.config,report:this.report,solutions:this.solutions,telescopeUrl:this.telescopeUrl,shareEndpoint:this.shareEndpoint,setTab:this.setTab,appEnv:this.appEnv,appDebug:this.appDebug}},components:{Summary:L,Tabs:Object(d.a)($,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("nav",{staticClass:"tab-nav"},[n("ul",{staticClass:"tab-bar"},t._l(t.tabs,(function(e){return n("li",{key:e.component},[n("button",{staticClass:"tab",class:t.value.component===e.component?"tab-active":"",on:{click:function(n){return n.preventDefault(),t.$emit("input",e)}}},[t._v("\n "+t._s(e.title)+"\n ")])])})),0),t._v(" "),t.shareButtonEnabled?[n("div",{staticClass:"tab-delimiter"}),t._v(" "),n("ShareButton")]:t._e()],2)}),[],!1,null,null,null).exports,Details:Object(d.a)(B,void 0,void 0,!1,null,null,null).exports,IconSymbols:h},methods:{setTab:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.tab={component:t,props:e}}},created:function(){}},q=Object(d.a)(z,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("IconSymbols"),t._v(" "),n("Summary"),t._v(" "),n("div",{staticClass:"layout-col mt-12"},[n("div",{staticClass:"tabs"},[n("Tabs",t._b({model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},"Tabs",{customTabs:t.customTabs},!1)),t._v(" "),n("div",{staticClass:"tab-main"},[n("Details",t._b({},"Details",{tab:t.tab},!1))],1)],1)])],1)}),[],!1,null,null,null).exports;function H(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function G(t){for(var e=1;e=this.selectedRange[0]&&t<=this.selectedRange[1])},editorUrl:function(t){return Object(c.a)(this.config,this.selectedFrame.file,t)},highlightedCode:function(t){var e=o.a.highlight("php",t||"",!0,this.highlightState);return this.highlightState=e.top,e.value||" "}}},l=n(0),f=Object(l.a)(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"stack-main"},[n("div",{staticClass:"stack-main-header"},[n("div",{staticClass:"grid cols-auto gap-2 justify-start items-center"},[n("ExceptionClass",{attrs:{name:t.selectedFrame.class||"",method:t.selectedFrame.method||""}})],1),t._v(" "),t.selectedFrame.file?n("FilePath",{staticClass:"mt-1",attrs:{"line-number":t.selectedFrame.line_number,file:t.selectedFrame.file,editable:!0}}):t._e()],1),t._v(" "),n("div",{staticClass:"stack-main-content"},[n("div",{staticClass:"stack-viewer scrollbar"},[n("div",{staticClass:"stack-ruler"},[n("div",{staticClass:"stack-lines"},t._l(t.selectedFrame.code_snippet,(function(e,r){return n("p",{key:r,staticClass:"stack-line cursor-pointer",class:{"stack-line-selected":t.withinSelectedRange(parseInt(r)),"stack-line-highlight":parseInt(r)===t.selectedFrame.line_number},on:{click:function(e){t.handleLineNumberClick(e,parseInt(r))}}},[t._v("\n "+t._s(r)+"\n ")])})),0)]),t._v(" "),n("pre",{ref:"codeContainer",staticClass:"stack-code",class:t.highlightTheme},[t._l(t.selectedFrame.code_snippet,(function(e,r){return n("p",{key:r,staticClass:"stack-code-line",class:{"stack-code-line-highlight":parseInt(r)===t.selectedFrame.line_number,"stack-code-line-selected":t.withinSelectedRange(parseInt(r))}},[n("span",{domProps:{innerHTML:t._s(t.highlightedCode(e))}}),n("a",{staticClass:"editor-link",attrs:{href:t.editorUrl(r)}},[n("Icon",{attrs:{name:"pencil"}})],1)])})),t._v("\n ")],2)])])])}),[],!1,null,null,null).exports,p={props:{frameGroup:{required:!0}},components:{ExceptionClass:i.a,FilePath:a.a,LineNumber:s.a}},d=Object(l.a)(p,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.frameGroup.expanded||"vendor"!==t.frameGroup.type?"unknown"===t.frameGroup.type?n("li",{staticClass:"stack-frame-group stack-frame-group-unknown"},[n("div",{staticClass:"stack-frame"},[n("button",{staticClass:"stack-frame-number"}),t._v(" "),n("div",{staticClass:"span-2 stack-frame-text"},[n("span",{staticClass:"text-left text-gray-500"},[t._v("\n "+t._s(t.frameGroup.frames.length>1?t.frameGroup.frames.length+" unknown frames":"1 unknown frame")+"\n ")])])])]):n("li",[n("ul",{staticClass:"stack-frame-group",class:"vendor"===t.frameGroup.type?"stack-frame-group-vendor":""},t._l(t.frameGroup.frames,(function(e,r){return n("li",{key:r,staticClass:"stack-frame | cursor-pointer",class:e.selected?"stack-frame-selected":"",on:{click:function(n){return t.$emit("select",e.frame_number)}}},[n("div",{staticClass:"stack-frame-number"},[t._v(t._s(e.frame_number))]),t._v(" "),n("div",{staticClass:"stack-frame-text"},[0===r?n("header",{staticClass:"stack-frame-header",class:e.class?"mb-1":""},[n("FilePath",{staticClass:"stack-frame-path",attrs:{pathClass:"vendor"===t.frameGroup.type?"text-gray-800":"text-purple-800",file:e.relative_file}})],1):t._e(),t._v(" "),e.class?n("span",{staticClass:"stack-frame-exception-class"},[n("ExceptionClass",{staticClass:"stack-frame-exception-class",attrs:{name:e.class}})],1):t._e()]),t._v(" "),n("div",{staticClass:"stack-frame-line"},[n("LineNumber",{attrs:{lineNumber:e.line_number}})],1)])})),0)]):n("li",{staticClass:"stack-frame-group stack-frame-group-vendor",on:{click:function(e){return t.$emit("expand")}}},[n("div",{staticClass:"stack-frame | cursor-pointer"},[n("button",{staticClass:"stack-frame-number"},[n("Icon",{staticClass:"align-middle text-gray-500",attrs:{name:"plus"}})],1),t._v(" "),n("div",{staticClass:"span-2 stack-frame-text"},[n("button",{staticClass:"text-left text-gray-500"},[t._v("\n "+t._s(t.frameGroup.frames.length>1?t.frameGroup.frames.length+" vendor frames…":"1 vendor frame…")+"\n ")])])])])}),[],!1,null,null,null).exports,h=n(6),g=n.n(h),m=n(4),v=n.n(m),b=n(16),_=n.n(b);function y(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function E(t){return t.map((function(e,n){return function(t){for(var e=1;e
-
-
-
-
-
- Vue App
-
-
-
-
-
diff --git a/vendor/facade/ignition/resources/views/errorPage.php b/vendor/facade/ignition/resources/views/errorPage.php
deleted file mode 100644
index 28102bf0a..000000000
--- a/vendor/facade/ignition/resources/views/errorPage.php
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- = $title ?>
-
-
-
-
-
-
-
-
-
-
-=$throwableString?>
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/vendor/facade/ignition/src/Actions/ShareReportAction.php b/vendor/facade/ignition/src/Actions/ShareReportAction.php
deleted file mode 100644
index 4ad968349..000000000
--- a/vendor/facade/ignition/src/Actions/ShareReportAction.php
+++ /dev/null
@@ -1,168 +0,0 @@
-client = $client;
- }
-
- public function handle(array $report, array $tabs, ?string $lineSelection = null)
- {
- $this->tabs = $tabs;
-
- $report = $this->filterReport($report);
-
- try {
- return $this->client->post('public-reports', [
- 'report' => $this->trimReport($report),
- 'tabs' => $tabs,
- 'lineSelection' => $lineSelection,
- ]);
- } catch (Exception $exception) {
- throw new UnableToShareErrorException($exception->getMessage());
- }
- }
-
- public function filterReport(array $report): array
- {
- if (! $this->hasTab('stackTraceTab')) {
- $report['stacktrace'] = array_slice($report['stacktrace'], 0, 1);
- }
-
- if (! $this->hasTab('debugTab')) {
- $report['glows'] = [];
- }
-
- $report['context'] = $this->filterContextItems($report['context']);
-
- return $report;
- }
-
- protected function hasTab(string $tab): bool
- {
- return in_array($tab, $this->tabs);
- }
-
- protected function filterContextItems(array $contextItems): array
- {
- if (! $this->hasTab('requestTab')) {
- $contextItems = $this->removeRequestInformation($contextItems);
- }
-
- if (! $this->hasTab('appTab')) {
- $contextItems = $this->removeAppInformation($contextItems);
- }
-
- if (! $this->hasTab('userTab')) {
- $contextItems = $this->removeUserInformation($contextItems);
- }
-
- if (! $this->hasTab('contextTab')) {
- $contextItems = $this->removeContextInformation($contextItems);
- }
-
- if (! $this->hasTab('debugTab')) {
- $contextItems = $this->removeDebugInformation($contextItems);
- }
-
- return $contextItems;
- }
-
- protected function removeRequestInformation(array $contextItems): array
- {
- Arr::forget($contextItems, 'request');
- Arr::forget($contextItems, 'request_data');
- Arr::forget($contextItems, 'headers');
- Arr::forget($contextItems, 'session');
- Arr::forget($contextItems, 'cookies');
-
- return $contextItems;
- }
-
- protected function removeAppInformation(array $contextItems): array
- {
- Arr::forget($contextItems, 'view');
- Arr::forget($contextItems, 'route');
-
- return $contextItems;
- }
-
- protected function removeUserInformation(array $contextItems): array
- {
- Arr::forget($contextItems, 'user');
- Arr::forget($contextItems, 'request.ip');
- Arr::forget($contextItems, 'request.useragent');
-
- return $contextItems;
- }
-
- protected function removeContextInformation(array $contextItems): array
- {
- Arr::forget($contextItems, 'env');
- Arr::forget($contextItems, 'git');
- Arr::forget($contextItems, 'context');
-
- Arr::forget($contextItems, $this->getCustomContextGroups($contextItems));
-
- return $contextItems;
- }
-
- protected function removeDebugInformation(array $contextItems): array
- {
- Arr::forget($contextItems, 'dumps');
- Arr::forget($contextItems, 'glows');
- Arr::forget($contextItems, 'logs');
- Arr::forget($contextItems, 'queries');
-
- return $contextItems;
- }
-
- protected function getCustomContextGroups(array $contextItems): array
- {
- $predefinedContextItemGroups = [
- 'request',
- 'request_data',
- 'headers',
- 'session',
- 'cookies',
- 'view',
- 'queries',
- 'route',
- 'user',
- 'env',
- 'git',
- 'context',
- 'logs',
- 'dumps',
- 'exception',
- ];
-
- return Collection::make($contextItems)
- ->reject(function ($_value, $group) use ($predefinedContextItemGroups) {
- return in_array($group, $predefinedContextItemGroups);
- })
- ->keys()
- ->toArray();
- }
-
- protected function trimReport(array $report): array
- {
- return (new ReportTrimmer())->trim($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Commands/SolutionMakeCommand.php b/vendor/facade/ignition/src/Commands/SolutionMakeCommand.php
deleted file mode 100644
index a9e2fc9c1..000000000
--- a/vendor/facade/ignition/src/Commands/SolutionMakeCommand.php
+++ /dev/null
@@ -1,65 +0,0 @@
-option('runnable')
- ? __DIR__.'/stubs/runnable-solution.stub'
- : __DIR__.'/stubs/solution.stub';
- }
-
- /**
- * Get the default namespace for the class.
- *
- * @param string $rootNamespace
- * @return string
- */
- protected function getDefaultNamespace($rootNamespace)
- {
- return $rootNamespace.'\Solutions';
- }
-
- /**
- * Get the console command options.
- *
- * @return array
- */
- protected function getOptions()
- {
- return [
- ['runnable', null, InputOption::VALUE_NONE, 'Create runnable solution'],
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/Commands/SolutionProviderMakeCommand.php b/vendor/facade/ignition/src/Commands/SolutionProviderMakeCommand.php
deleted file mode 100644
index 2c87fa4b2..000000000
--- a/vendor/facade/ignition/src/Commands/SolutionProviderMakeCommand.php
+++ /dev/null
@@ -1,50 +0,0 @@
-runningInConsole()) {
- return new LaravelConsoleContext($_SERVER['argv'] ?? []);
- }
-
- $request = app(Request::class);
-
- if ($this->isRunningLiveWire($request)) {
- return new LivewireRequestContext($request, app(LivewireManager::class));
- }
-
- return new LaravelRequestContext($request);
- }
-
- protected function isRunningLiveWire(Request $request)
- {
- return $request->hasHeader('x-livewire') && $request->hasHeader('referer');
- }
-}
diff --git a/vendor/facade/ignition/src/Context/LaravelRequestContext.php b/vendor/facade/ignition/src/Context/LaravelRequestContext.php
deleted file mode 100644
index 74be8bdde..000000000
--- a/vendor/facade/ignition/src/Context/LaravelRequestContext.php
+++ /dev/null
@@ -1,85 +0,0 @@
-request = $request;
- }
-
- public function getUser(): array
- {
- try {
- $user = $this->request->user();
-
- if (! $user) {
- return [];
- }
- } catch (Throwable $e) {
- return [];
- }
-
- try {
- if (method_exists($user, 'toFlare')) {
- return $user->toFlare();
- }
-
- if (method_exists($user, 'toArray')) {
- return $user->toArray();
- }
- } catch (Throwable $e) {
- return [];
- }
-
- return [];
- }
-
- public function getRoute(): array
- {
- $route = $this->request->route();
-
- return [
- 'route' => optional($route)->getName(),
- 'routeParameters' => $this->getRouteParameters(),
- 'controllerAction' => optional($route)->getActionName(),
- 'middleware' => array_values(optional($route)->gatherMiddleware() ?? []),
- ];
- }
-
- protected function getRouteParameters(): array
- {
- try {
- return collect(optional($this->request->route())->parameters ?? [])
- ->map(function ($parameter) {
- return $parameter instanceof Model ? $parameter->withoutRelations() : $parameter;
- })
- ->map(function ($parameter) {
- return method_exists($parameter, 'toFlare') ? $parameter->toFlare() : $parameter;
- })
- ->toArray();
- } catch (Throwable $e) {
- return [];
- }
- }
-
- public function toArray(): array
- {
- $properties = parent::toArray();
-
- $properties['route'] = $this->getRoute();
-
- $properties['user'] = $this->getUser();
-
- return $properties;
- }
-}
diff --git a/vendor/facade/ignition/src/Context/LivewireRequestContext.php b/vendor/facade/ignition/src/Context/LivewireRequestContext.php
deleted file mode 100644
index 98e8f8c6e..000000000
--- a/vendor/facade/ignition/src/Context/LivewireRequestContext.php
+++ /dev/null
@@ -1,94 +0,0 @@
-livewireManager = $livewireManager;
- }
-
- public function getRequest(): array
- {
- $properties = parent::getRequest();
-
- $properties['method'] = $this->livewireManager->originalMethod();
- $properties['url'] = $this->livewireManager->originalUrl();
-
- return $properties;
- }
-
- public function toArray(): array
- {
- $properties = parent::toArray();
-
- $properties['livewire'] = $this->getLiveWireInformation();
-
- return $properties;
- }
-
- protected function getLiveWireInformation(): array
- {
- $componentId = $this->request->input('fingerprint.id');
- $componentAlias = $this->request->input('fingerprint.name');
-
- if ($componentAlias === null) {
- return [];
- }
-
- try {
- $componentClass = $this->livewireManager->getClass($componentAlias);
- } catch (Exception $e) {
- $componentClass = null;
- }
-
- return [
- 'component_class' => $componentClass,
- 'component_alias' => $componentAlias,
- 'component_id' => $componentId,
- 'data' => $this->resolveData(),
- 'updates' => $this->resolveUpdates(),
- ];
- }
-
- protected function resolveData(): array
- {
- $data = $this->request->input('serverMemo.data') ?? [];
-
- $dataMeta = $this->request->input('serverMemo.dataMeta') ?? [];
-
- foreach ($dataMeta['modelCollections'] ?? [] as $key => $value) {
- $data[$key] = array_merge($data[$key] ?? [], $value);
- }
-
- foreach ($dataMeta['models'] ?? [] as $key => $value) {
- $data[$key] = array_merge($data[$key] ?? [], $value);
- }
-
- return $data;
- }
-
- protected function resolveUpdates()
- {
- $updates = $this->request->input('updates') ?? [];
-
- return array_map(function (array $update) {
- $update['payload'] = Arr::except($update['payload'] ?? [], ['id']);
-
- return $update;
- }, $updates);
- }
-}
diff --git a/vendor/facade/ignition/src/DumpRecorder/Dump.php b/vendor/facade/ignition/src/DumpRecorder/Dump.php
deleted file mode 100644
index f68191e02..000000000
--- a/vendor/facade/ignition/src/DumpRecorder/Dump.php
+++ /dev/null
@@ -1,36 +0,0 @@
-htmlDump = $htmlDump;
- $this->file = $file;
- $this->lineNumber = $lineNumber;
- $this->microtime = $microtime ?? microtime(true);
- }
-
- public function toArray(): array
- {
- return [
- 'html_dump' => $this->htmlDump,
- 'file' => $this->file,
- 'line_number' => $this->lineNumber,
- 'microtime' => $this->microtime,
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/DumpRecorder/DumpHandler.php b/vendor/facade/ignition/src/DumpRecorder/DumpHandler.php
deleted file mode 100644
index 636f1e327..000000000
--- a/vendor/facade/ignition/src/DumpRecorder/DumpHandler.php
+++ /dev/null
@@ -1,23 +0,0 @@
-dumpRecorder = $dumpRecorder;
- }
-
- public function dump($value)
- {
- $data = (new VarCloner())->cloneVar($value);
-
- $this->dumpRecorder->record($data);
- }
-}
diff --git a/vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php b/vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php
deleted file mode 100644
index 7418aff85..000000000
--- a/vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php
+++ /dev/null
@@ -1,112 +0,0 @@
-app = $app;
- }
-
- public function register(): self
- {
- $multiDumpHandler = new MultiDumpHandler();
-
- $this->app->singleton(MultiDumpHandler::class, function () use ($multiDumpHandler) {
- return $multiDumpHandler;
- });
-
- $previousHandler = VarDumper::setHandler(function ($var) use ($multiDumpHandler) {
- $multiDumpHandler->dump($var);
- });
-
- if ($previousHandler) {
- $multiDumpHandler->addHandler($previousHandler);
- } else {
- $multiDumpHandler->addHandler($this->getDefaultHandler());
- }
-
- $multiDumpHandler->addHandler(function ($var) {
- (new DumpHandler($this))->dump($var);
- });
-
- return $this;
- }
-
- public function record(Data $data)
- {
- $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8);
- $file = (string)Arr::get($backtrace, '6.file');
- $lineNumber = (int)Arr::get($backtrace, '6.line');
-
- if (! Arr::exists($backtrace, '7.class') && (string)Arr::get($backtrace, '7.function') === 'ddd') {
- $file = (string)Arr::get($backtrace, '7.file');
- $lineNumber = (int)Arr::get($backtrace, '7.line');
- }
-
- $htmlDump = (new HtmlDumper())->dump($data);
-
- $this->dumps[] = new Dump($htmlDump, $file, $lineNumber);
- }
-
- public function getDumps(): array
- {
- return $this->toArray();
- }
-
- public function reset()
- {
- $this->dumps = [];
- }
-
- public function toArray(): array
- {
- $dumps = [];
-
- foreach ($this->dumps as $dump) {
- $dumps[] = $dump->toArray();
- }
-
- return $dumps;
- }
-
- protected function getDefaultHandler()
- {
- return function ($value) {
- $data = (new VarCloner())->cloneVar($value);
-
- $this->getDumper()->dump($data);
- };
- }
-
- protected function getDumper()
- {
- if (isset($_SERVER['VAR_DUMPER_FORMAT'])) {
- if ($_SERVER['VAR_DUMPER_FORMAT'] === 'html') {
- return new BaseHtmlDumper();
- }
-
- return new CliDumper();
- }
-
- if (in_array(PHP_SAPI, ['cli', 'phpdbg']) && ! isset($_SERVER['LARAVEL_OCTANE'])) {
- return new CliDumper() ;
- }
-
- return new BaseHtmlDumper();
- }
-}
diff --git a/vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php b/vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php
deleted file mode 100644
index d4cf0c3f6..000000000
--- a/vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php
+++ /dev/null
@@ -1,29 +0,0 @@
-cloneVar($variable)->withMaxDepth(3);
-
- return $this->dump($clonedData);
- }
-
- public function dump(Data $data, $output = null, array $extraDisplayOptions = []): string
- {
- return (string)parent::dump($data, true, [
- 'maxDepth' => 3,
- 'maxStringLength' => 160,
- ]);
- }
-}
diff --git a/vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php b/vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php
deleted file mode 100644
index 2902a7f59..000000000
--- a/vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php
+++ /dev/null
@@ -1,23 +0,0 @@
-handlers as $handler) {
- $handler($value);
- }
- }
-
- public function addHandler(callable $callable = null): self
- {
- $this->handlers[] = $callable;
-
- return $this;
- }
-}
diff --git a/vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php b/vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php
deleted file mode 100644
index 637b84c26..000000000
--- a/vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php
+++ /dev/null
@@ -1,77 +0,0 @@
-flareClient = $app->make(Flare::class);
- $this->ignitionConfig = $ignitionConfig;
- $this->renderer = $renderer;
- $this->solutionProviderRepository = $solutionProviderRepository;
- }
-
- public function handle(Throwable $throwable, $defaultTab = null, $defaultTabProps = [])
- {
- $report = $this->flareClient->createReport($throwable);
-
- $solutions = $this->solutionProviderRepository->getSolutionsForThrowable($throwable);
-
- $viewModel = new ErrorPageViewModel(
- $throwable,
- $this->ignitionConfig,
- $report,
- $solutions
- );
-
- $viewModel->defaultTab($defaultTab, $defaultTabProps);
-
- $this->renderException($viewModel);
- }
-
- public function handleReport(Report $report, $defaultTab = null, $defaultTabProps = [])
- {
- $viewModel = new ErrorPageViewModel(
- $report->getThrowable(),
- $this->ignitionConfig,
- $report,
- []
- );
-
- $viewModel->defaultTab($defaultTab, $defaultTabProps);
-
- $this->renderException($viewModel);
- }
-
- protected function renderException(ErrorPageViewModel $exceptionViewModel)
- {
- echo $this->renderer->render(
- 'errorPage',
- $exceptionViewModel->toArray()
- );
- }
-}
diff --git a/vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php b/vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php
deleted file mode 100644
index 5f99f2a84..000000000
--- a/vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php
+++ /dev/null
@@ -1,200 +0,0 @@
-throwable = $throwable;
-
- $this->ignitionConfig = $ignitionConfig;
-
- $this->report = $report;
-
- $this->solutions = $solutions;
-
- $this->appEnv = config('app.env');
- $this->appDebug = config('app.debug');
- }
-
- public function throwableString(): string
- {
- if (! $this->throwable) {
- return '';
- }
-
- $throwableString = sprintf(
- "%s: %s in file %s on line %d\n\n%s\n",
- get_class($this->throwable),
- $this->throwable->getMessage(),
- $this->throwable->getFile(),
- $this->throwable->getLine(),
- $this->report->getThrowable()->getTraceAsString()
- );
-
- return htmlspecialchars($throwableString);
- }
-
- public function telescopeUrl(): ?string
- {
- try {
- if (! class_exists(Telescope::class)) {
- return null;
- }
-
- if (! count(Telescope::$entriesQueue)) {
- return null;
- }
-
- $telescopeEntry = collect(Telescope::$entriesQueue)->first(function ($entry) {
- return $entry instanceof IncomingExceptionEntry;
- });
-
- if (is_null($telescopeEntry)) {
- return null;
- }
-
- $telescopeEntryId = (string) $telescopeEntry->uuid;
-
- return url(action([HomeController::class, 'index'])."/exceptions/{$telescopeEntryId}");
- } catch (Exception $exception) {
- return null;
- }
- }
-
- public function title(): string
- {
- $message = htmlspecialchars($this->report->getMessage());
-
- return "🧨 {$message}";
- }
-
- public function config(): array
- {
- return $this->ignitionConfig->toArray();
- }
-
- public function solutions(): array
- {
- $solutions = [];
-
- foreach ($this->solutions as $solution) {
- $solutions[] = (new SolutionTransformer($solution))->toArray();
- }
-
- return $solutions;
- }
-
- protected function shareEndpoint(): string
- {
- try {
- // use string notation as L5.5 and L5.6 don't support array notation yet
- return action('\Facade\Ignition\Http\Controllers\ShareReportController');
- } catch (Exception $exception) {
- return '';
- }
- }
-
- public function report(): array
- {
- return $this->report->toArray();
- }
-
- public function jsonEncode($data): string
- {
- $jsonOptions = JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT;
-
- return json_encode($data, $jsonOptions);
- }
-
- public function getAssetContents(string $asset): string
- {
- $assetPath = __DIR__."/../../resources/compiled/{$asset}";
-
- return file_get_contents($assetPath);
- }
-
- public function styles(): array
- {
- return array_keys(Ignition::styles());
- }
-
- public function scripts(): array
- {
- return array_keys(Ignition::scripts());
- }
-
- public function tabs(): string
- {
- return json_encode(Ignition::$tabs);
- }
-
- public function defaultTab(?string $defaultTab, ?array $defaultTabProps)
- {
- $this->defaultTab = $defaultTab ?? 'StackTab';
-
- if ($defaultTabProps) {
- $this->defaultTabProps = $defaultTabProps;
- }
- }
-
- public function toArray(): array
- {
- return [
- 'throwableString' => $this->throwableString(),
- 'telescopeUrl' => $this->telescopeUrl(),
- 'shareEndpoint' => $this->shareEndpoint(),
- 'title' => $this->title(),
- 'config' => $this->config(),
- 'solutions' => $this->solutions(),
- 'report' => $this->report(),
- 'housekeepingEndpoint' => url(config('ignition.housekeeping_endpoint_prefix', '_ignition')),
- 'styles' => $this->styles(),
- 'scripts' => $this->scripts(),
- 'tabs' => $this->tabs(),
- 'jsonEncode' => Closure::fromCallable([$this, 'jsonEncode']),
- 'getAssetContents' => Closure::fromCallable([$this, 'getAssetContents']),
- 'defaultTab' => $this->defaultTab,
- 'defaultTabProps' => $this->defaultTabProps,
- 'appEnv' => $this->appEnv,
- 'appDebug' => $this->appDebug,
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/ErrorPage/IgnitionExceptionRenderer.php b/vendor/facade/ignition/src/ErrorPage/IgnitionExceptionRenderer.php
deleted file mode 100644
index ec53dd361..000000000
--- a/vendor/facade/ignition/src/ErrorPage/IgnitionExceptionRenderer.php
+++ /dev/null
@@ -1,26 +0,0 @@
-errorPageHandler = $errorPageHandler;
- }
-
- public function render($throwable)
- {
- ob_start();
-
- $this->errorPageHandler->handle($throwable);
-
- return ob_get_clean();
- }
-}
diff --git a/vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php b/vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php
deleted file mode 100644
index fda4d5c9e..000000000
--- a/vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php
+++ /dev/null
@@ -1,48 +0,0 @@
-errorPageHandler = $errorPageHandler;
- }
-
- public function handle(): ?int
- {
- try {
- $this->errorPageHandler->handle($this->exception);
- } catch (Error $error) {
- // Errors aren't caught by Whoops.
- // Convert the error to an exception and throw again.
-
- throw new ErrorException(
- $error->getMessage(),
- $error->getCode(),
- 1,
- $error->getFile(),
- $error->getLine(),
- $error
- );
- }
-
- return Handler::QUIT;
- }
-
- /** @param \Throwable $exception */
- public function setException($exception): void
- {
- $this->exception = $exception;
- }
-}
diff --git a/vendor/facade/ignition/src/ErrorPage/Renderer.php b/vendor/facade/ignition/src/ErrorPage/Renderer.php
deleted file mode 100644
index a058eb6e3..000000000
--- a/vendor/facade/ignition/src/ErrorPage/Renderer.php
+++ /dev/null
@@ -1,43 +0,0 @@
-viewPath = $this->formatPath($viewPath);
- }
-
- public function render(string $viewName, array $_data): string
- {
- ob_start();
-
- $viewFile = "{$this->viewPath}/{$viewName}.php";
-
- try {
- extract($_data, EXTR_OVERWRITE);
-
- include $viewFile;
- } catch (Exception $exception) {
- $viewException = new ViewException($exception->getMessage());
- $viewException->setView($viewFile);
- $viewException->setViewData($_data);
-
- throw $viewException;
- }
-
- return ob_get_clean();
- }
-
- protected function formatPath(string $path): string
- {
- return preg_replace('/(?:\/)+$/u', '', $path).'/';
- }
-}
diff --git a/vendor/facade/ignition/src/Exceptions/InvalidConfig.php b/vendor/facade/ignition/src/Exceptions/InvalidConfig.php
deleted file mode 100644
index e48a2812b..000000000
--- a/vendor/facade/ignition/src/Exceptions/InvalidConfig.php
+++ /dev/null
@@ -1,29 +0,0 @@
-setSolutionDescription("Please change the log level in your `config/logging.php` file. Valid log levels are {$validLogLevelsString}.");
- }
-}
diff --git a/vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php b/vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php
deleted file mode 100644
index 408bdefef..000000000
--- a/vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-viewData = $data;
- }
-
- public function getViewData(): array
- {
- return $this->viewData;
- }
-
- public function setView(string $path)
- {
- $this->view = $path;
- }
-
- protected function dumpViewData($variable): string
- {
- return (new HtmlDumper())->dumpVariable($variable);
- }
-
- public function context(): array
- {
- $context = [
- 'view' => [
- 'view' => $this->view,
- ],
- ];
-
- if (config('flare.reporting.report_view_data')) {
- $context['view']['data'] = array_map([$this, 'dumpViewData'], $this->viewData);
- }
-
- return $context;
- }
-}
diff --git a/vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php b/vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php
deleted file mode 100644
index 96319aafd..000000000
--- a/vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php
+++ /dev/null
@@ -1,22 +0,0 @@
-solution = $solution;
- }
-
- public function getSolution(): Solution
- {
- return $this->solution;
- }
-}
diff --git a/vendor/facade/ignition/src/Facades/Flare.php b/vendor/facade/ignition/src/Facades/Flare.php
deleted file mode 100644
index e689afb95..000000000
--- a/vendor/facade/ignition/src/Facades/Flare.php
+++ /dev/null
@@ -1,28 +0,0 @@
-ensureLocalEnvironment();
- $this->ensureLocalRequest();
-
- $solution = $request->getRunnableSolution();
-
- $solution->run($request->get('parameters', []));
-
- return response('');
- }
-
- public function ensureLocalEnvironment()
- {
- if (! app()->environment('local')) {
- abort(403, "Runnable solutions are disabled in non-local environments. Please make sure `APP_ENV` is set correctly. Additionally please make sure `APP_DEBUG` is set to false on ANY production environment!");
- }
- }
-
- public function ensureLocalRequest()
- {
- $ipIsPublic = filter_var(
- request()->ip(),
- FILTER_VALIDATE_IP,
- FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
- );
-
- if ($ipIsPublic) {
- abort(403, "Solutions can only be executed by requests from a local IP address. Please also make sure `APP_DEBUG` is set to false on ANY production environment.");
- }
- }
-}
diff --git a/vendor/facade/ignition/src/Http/Controllers/ScriptController.php b/vendor/facade/ignition/src/Http/Controllers/ScriptController.php
deleted file mode 100644
index 9860f45e7..000000000
--- a/vendor/facade/ignition/src/Http/Controllers/ScriptController.php
+++ /dev/null
@@ -1,24 +0,0 @@
-script])) {
- abort(404, 'Script not found');
- }
-
- return response(
- file_get_contents(
- Ignition::scripts()[$request->script]
- ),
- 200,
- ['Content-Type' => 'application/javascript']
- );
- }
-}
diff --git a/vendor/facade/ignition/src/Http/Controllers/ShareReportController.php b/vendor/facade/ignition/src/Http/Controllers/ShareReportController.php
deleted file mode 100644
index a56ae4054..000000000
--- a/vendor/facade/ignition/src/Http/Controllers/ShareReportController.php
+++ /dev/null
@@ -1,19 +0,0 @@
-handle(json_decode($request->get('report'), true), $request->get('tabs'), $request->get('lineSelection'));
- } catch (UnableToShareErrorException $exception) {
- abort(500, 'Unable to share the error '.$exception->getMessage());
- }
- }
-}
diff --git a/vendor/facade/ignition/src/Http/Controllers/StyleController.php b/vendor/facade/ignition/src/Http/Controllers/StyleController.php
deleted file mode 100644
index 1bcfecdf0..000000000
--- a/vendor/facade/ignition/src/Http/Controllers/StyleController.php
+++ /dev/null
@@ -1,18 +0,0 @@
-style]),
- 200,
- ['Content-Type' => 'text/css']
- );
- }
-}
diff --git a/vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php b/vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php
deleted file mode 100644
index c92931210..000000000
--- a/vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php
+++ /dev/null
@@ -1,27 +0,0 @@
-ignitionConfig = $ignitionConfig;
- }
-
- public function handle(Request $request, Closure $next, string $value)
- {
- if (! $this->ignitionConfig->toArray()[$value]) {
- abort(404);
- }
-
- return $next($request);
- }
-}
diff --git a/vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php b/vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php
deleted file mode 100644
index 25a0926eb..000000000
--- a/vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php
+++ /dev/null
@@ -1,30 +0,0 @@
-ignitionEnabled()) {
- abort(404);
- }
-
- return $next($request);
- }
-
- protected function ignitionEnabled(): bool
- {
- return config('app.debug');
- }
-}
diff --git a/vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php b/vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php
deleted file mode 100644
index 11363e6b6..000000000
--- a/vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php
+++ /dev/null
@@ -1,17 +0,0 @@
- 'required',
- 'tabs' => 'required|array|min:1',
- 'lineSelection' => [],
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/Ignition.php b/vendor/facade/ignition/src/Ignition.php
deleted file mode 100644
index 4bebaf4b8..000000000
--- a/vendor/facade/ignition/src/Ignition.php
+++ /dev/null
@@ -1,43 +0,0 @@
-flatMap(function ($tab) {
- return $tab->styles;
- })
- ->unique()
- ->toArray();
- }
-
- public static function scripts(): array
- {
- return collect(static::$tabs)->flatMap(function ($tab) {
- return $tab->scripts;
- })
- ->unique()
- ->toArray();
- }
-
- public static function registerAssets(Closure $callable)
- {
- static::$callBeforeShowingErrorPage[] = $callable;
- }
-}
diff --git a/vendor/facade/ignition/src/IgnitionConfig.php b/vendor/facade/ignition/src/IgnitionConfig.php
deleted file mode 100644
index d6304cd58..000000000
--- a/vendor/facade/ignition/src/IgnitionConfig.php
+++ /dev/null
@@ -1,75 +0,0 @@
-options = $this->mergeWithDefaultConfig($options);
- }
-
- public function getEditor(): ?string
- {
- return Arr::get($this->options, 'editor');
- }
-
- public function getRemoteSitesPath(): ?string
- {
- return Arr::get($this->options, 'remote_sites_path');
- }
-
- public function getLocalSitesPath(): ?string
- {
- return Arr::get($this->options, 'local_sites_path');
- }
-
- public function getTheme(): ?string
- {
- return Arr::get($this->options, 'theme');
- }
-
- public function getEnableShareButton(): bool
- {
- if (! app()->isBooted()) {
- return false;
- }
-
- return Arr::get($this->options, 'enable_share_button', true);
- }
-
- public function getEnableRunnableSolutions(): bool
- {
- $enabled = Arr::get($this->options, 'enable_runnable_solutions', null);
-
- if ($enabled === null) {
- $enabled = config('app.debug');
- }
-
- return $enabled ?? false;
- }
-
- public function toArray(): array
- {
- return [
- 'editor' => $this->getEditor(),
- 'remoteSitesPath' => $this->getRemoteSitesPath(),
- 'localSitesPath' => $this->getLocalSitesPath(),
- 'theme' => $this->getTheme(),
- 'enableShareButton' => $this->getEnableShareButton(),
- 'enableRunnableSolutions' => $this->getEnableRunnableSolutions(),
- 'directorySeparator' => DIRECTORY_SEPARATOR,
- ];
- }
-
- protected function mergeWithDefaultConfig(array $options = []): array
- {
- return array_merge(config('ignition') ?: include __DIR__.'/../config/ignition.php', $options);
- }
-}
diff --git a/vendor/facade/ignition/src/IgnitionServiceProvider.php b/vendor/facade/ignition/src/IgnitionServiceProvider.php
deleted file mode 100644
index adb358705..000000000
--- a/vendor/facade/ignition/src/IgnitionServiceProvider.php
+++ /dev/null
@@ -1,559 +0,0 @@
-app->runningInConsole()) {
- $this->publishes([
- __DIR__.'/../config/flare.php' => config_path('flare.php'),
- ], 'flare-config');
-
- $this->publishes([
- __DIR__.'/../config/ignition.php' => config_path('ignition.php'),
- ], 'ignition-config');
-
- if (isset($_SERVER['argv']) && ['artisan', 'tinker'] === $_SERVER['argv']) {
- Api::sendReportsInBatches(false);
- }
-
- $this->app->make(JobRecorder::class)->register();
- }
-
- $this
- ->registerViewEngines()
- ->registerHousekeepingRoutes()
- ->registerLogHandler()
- ->registerCommands();
-
- if ($this->app->bound('queue')) {
- $this->setupQueue($this->app->get('queue'));
- }
-
- if (isset($_SERVER['LARAVEL_OCTANE'])) {
- $this->setupOctane();
- }
-
- if (config('flare.reporting.report_logs', true)) {
- $this->app->make(LogRecorder::class)->register();
- }
-
- if (config('flare.reporting.report_queries', true)) {
- $this->app->make(QueryRecorder::class)->register();
- }
-
- $this->app->make(DumpRecorder::class)->register();
- }
-
- public function register()
- {
- $this->mergeConfigFrom(__DIR__.'/../config/flare.php', 'flare');
- $this->mergeConfigFrom(__DIR__.'/../config/ignition.php', 'ignition');
-
- $this
- ->registerSolutionProviderRepository()
- ->registerRenderer()
- ->registerExceptionRenderer()
- ->registerIgnitionConfig()
- ->registerFlare()
- ->registerDumpCollector()
- ->registerJobRecorder();
-
- if (config('flare.reporting.report_logs', true)) {
- $this->registerLogRecorder();
- }
-
- if (config('flare.reporting.report_queries', true)) {
- $this->registerQueryRecorder();
- }
-
- if (config('flare.reporting.anonymize_ips')) {
- $this->app->get(Flare::class)->anonymizeIp();
- }
-
- $this->app->get(Flare::class)->censorRequestBodyFields(config('flare.reporting.censor_request_body_fields', ['password']));
-
- $this->registerBuiltInMiddleware();
- }
-
- protected function registerViewEngines()
- {
- if (! $this->hasCustomViewEnginesRegistered()) {
- return $this;
- }
-
- $this->app->make('view.engine.resolver')->register('php', function () {
- return new PhpEngine($this->app['files']);
- });
-
- $this->app->make('view.engine.resolver')->register('blade', function () {
- if (class_exists(CompilerEngineForIgnition::class)) {
- return new CompilerEngineForIgnition($this->app['blade.compiler']);
- }
-
- return new CompilerEngine($this->app['blade.compiler']);
- });
-
- return $this;
- }
-
- protected function registerHousekeepingRoutes()
- {
- if ($this->app->runningInConsole()) {
- return $this;
- }
-
- Route::group([
- 'as' => 'ignition.',
- 'prefix' => config('ignition.housekeeping_endpoint_prefix', '_ignition'),
- 'middleware' => [IgnitionEnabled::class],
- ], function () {
- Route::get('health-check', HealthCheckController::class)->name('healthCheck');
-
- Route::post('execute-solution', ExecuteSolutionController::class)
- ->middleware(IgnitionConfigValueEnabled::class.':enableRunnableSolutions')
- ->name('executeSolution');
-
- Route::post('share-report', ShareReportController::class)
- ->middleware(IgnitionConfigValueEnabled::class.':enableShareButton')
- ->name('shareReport');
-
- Route::get('scripts/{script}', ScriptController::class)->name('scripts');
- Route::get('styles/{style}', StyleController::class)->name('styles');
- });
-
- return $this;
- }
-
- protected function registerSolutionProviderRepository()
- {
- $this->app->singleton(SolutionProviderRepositoryContract::class, function () {
- $defaultSolutions = $this->getDefaultSolutions();
-
- return new SolutionProviderRepository($defaultSolutions);
- });
-
- return $this;
- }
-
- protected function registerRenderer()
- {
- $this->app->bind(Renderer::class, function () {
- return new Renderer(__DIR__.'/../resources/views/');
- });
-
- return $this;
- }
-
- protected function registerExceptionRenderer()
- {
- if (interface_exists(\Whoops\Handler\HandlerInterface::class)) {
- $this->app->bind(\Whoops\Handler\HandlerInterface::class, function (Application $app) {
- return $app->make(IgnitionWhoopsHandler::class);
- });
- }
-
- if (interface_exists(\Illuminate\Contracts\Foundation\ExceptionRenderer::class)) {
- $this->app->bind(\Illuminate\Contracts\Foundation\ExceptionRenderer::class, function (Application $app) {
- return $app->make(IgnitionExceptionRenderer::class);
- });
- }
-
- return $this;
- }
-
- protected function registerIgnitionConfig()
- {
- $this->app->singleton(IgnitionConfig::class, function () {
- $options = [];
-
- try {
- if ($configPath = $this->getConfigFileLocation()) {
- $options = require $configPath;
- }
- } catch (Throwable $e) {
- // possible open_basedir restriction
- }
-
- return new IgnitionConfig($options);
- });
-
- return $this;
- }
-
- protected function registerFlare()
- {
- $this->app->singleton('flare.http', function () {
- return new Client(
- config('flare.key'),
- config('flare.secret'),
- config('flare.base_url', 'https://reporting.flareapp.io/api')
- );
- });
-
- $this->app->singleton(SentReports::class);
-
- $this->app->alias('flare.http', Client::class);
-
- $this->app->singleton(Flare::class, function () {
- $client = new Flare($this->app->get('flare.http'), new LaravelContextDetector(), $this->app);
- $client->applicationPath(base_path());
- $client->stage(config('app.env'));
-
- return $client;
- });
-
- return $this;
- }
-
- protected function registerLogHandler()
- {
- $this->app->singleton('flare.logger', function ($app) {
- $handler = new FlareHandler(
- $app->make(Flare::class),
- $app->make(SentReports::class)
- );
-
- $logLevelString = config('logging.channels.flare.level', 'error');
-
- $logLevel = $this->getLogLevel($logLevelString);
-
- $handler->setMinimumReportLogLevel($logLevel);
-
- $logger = new Logger('Flare');
- $logger->pushHandler($handler);
-
- return $logger;
- });
-
- if ($this->app['log'] instanceof LogManager) {
- Log::extend('flare', function ($app) {
- return $app['flare.logger'];
- });
- } else {
- $this->bindLogListener();
- }
-
- return $this;
- }
-
- protected function getLogLevel(string $logLevelString): int
- {
- $logLevel = Logger::getLevels()[strtoupper($logLevelString)] ?? null;
-
- if (! $logLevel) {
- throw InvalidConfig::invalidLogLevel($logLevelString);
- }
-
- return $logLevel;
- }
-
- protected function registerLogRecorder(): self
- {
- $this->app->singleton(LogRecorder::class, function (Application $app): LogRecorder {
- return new LogRecorder(
- $app,
- $app->get('config')->get('flare.reporting.maximum_number_of_collected_logs')
- );
- });
-
- return $this;
- }
-
- protected function registerDumpCollector()
- {
- $dumpCollector = $this->app->make(DumpRecorder::class);
-
- $this->app->singleton(DumpRecorder::class);
-
- $this->app->instance(DumpRecorder::class, $dumpCollector);
-
- return $this;
- }
-
- protected function registerJobRecorder()
- {
- if (! $this->app->runningInConsole()) {
- return $this;
- }
-
- $this->app->singleton(JobRecorder::class);
-
- return $this;
- }
-
- protected function registerCommands()
- {
- $this->app->bind('command.flare:test', TestCommand::class);
- $this->app->bind('command.make:solution', SolutionMakeCommand::class);
- $this->app->bind('command.make:solution-provider', SolutionProviderMakeCommand::class);
-
- if ($this->app['config']->get('flare.key')) {
- $this->commands(['command.flare:test']);
- }
-
- if ($this->app['config']->get('ignition.register_commands', false)) {
- $this->commands(['command.make:solution']);
- $this->commands(['command.make:solution-provider']);
- }
-
- return $this;
- }
-
- protected function registerQueryRecorder(): self
- {
- $this->app->singleton(QueryRecorder::class, function (Application $app): QueryRecorder {
- return new QueryRecorder(
- $app,
- $app->get('config')->get('flare.reporting.report_query_bindings'),
- $app->get('config')->get('flare.reporting.maximum_number_of_collected_queries')
- );
- });
-
- return $this;
- }
-
- protected function registerBuiltInMiddleware()
- {
- $middlewares = [
- SetNotifierName::class,
- AddEnvironmentInformation::class,
- AddExceptionInformation::class,
- ];
-
- if (config('flare.reporting.report_logs', true)) {
- $middlewares[] = AddLogs::class;
- }
-
- $middlewares[] = AddDumps::class;
-
- if (config('flare.reporting.report_queries', true)) {
- $middlewares[] = AddQueries::class;
- }
-
- $middlewares[] = AddSolutions::class;
-
- if ($this->app->runningInConsole()) {
- $middlewares[] = AddJobInformation::class;
- }
-
- $middleware = collect($middlewares)
- ->map(function (string $middlewareClass) {
- return $this->app->make($middlewareClass);
- });
-
- if (config('flare.reporting.collect_git_information')) {
- $middleware[] = (new AddGitInformation());
- }
-
- foreach ($middleware as $singleMiddleware) {
- $this->app->get(Flare::class)->registerMiddleware($singleMiddleware);
- }
-
- return $this;
- }
-
- protected function getDefaultSolutions(): array
- {
- return [
- IncorrectValetDbCredentialsSolutionProvider::class,
- MissingAppKeySolutionProvider::class,
- DefaultDbNameSolutionProvider::class,
- BadMethodCallSolutionProvider::class,
- TableNotFoundSolutionProvider::class,
- MissingImportSolutionProvider::class,
- MissingPackageSolutionProvider::class,
- InvalidRouteActionSolutionProvider::class,
- ViewNotFoundSolutionProvider::class,
- UndefinedVariableSolutionProvider::class,
- MergeConflictSolutionProvider::class,
- RunningLaravelDuskInProductionProvider::class,
- MissingColumnSolutionProvider::class,
- UnknownValidationSolutionProvider::class,
- UndefinedLivewireMethodSolutionProvider::class,
- UndefinedLivewirePropertySolutionProvider::class,
- UndefinedPropertySolutionProvider::class,
- MissingMixManifestSolutionProvider::class,
- MissingLivewireComponentSolutionProvider::class,
- LazyLoadingViolationSolutionProvider::class,
- ];
- }
-
- protected function hasCustomViewEnginesRegistered()
- {
- $resolver = $this->app->make('view.engine.resolver');
-
- if (! $resolver->resolve('php') instanceof LaravelPhpEngine) {
- return false;
- }
-
- if (! $resolver->resolve('blade') instanceof LaravelCompilerEngine) {
- return false;
- }
-
- return true;
- }
-
- protected function bindLogListener()
- {
- $this->app['log']->listen(function (MessageLogged $messageLogged) {
- if (config('flare.key')) {
- try {
- $this->app['flare.logger']->log(
- $messageLogged->level,
- $messageLogged->message,
- $messageLogged->context
- );
- } catch (Exception $exception) {
- return;
- }
- }
- });
- }
-
- protected function getConfigFileLocation(): ?string
- {
- $configFullPath = base_path().DIRECTORY_SEPARATOR.'.ignition';
-
- if (file_exists($configFullPath)) {
- return $configFullPath;
- }
-
- $configFullPath = Arr::get($_SERVER, 'HOME', '').DIRECTORY_SEPARATOR.'.ignition';
-
- if (file_exists($configFullPath)) {
- return $configFullPath;
- }
-
- return null;
- }
-
- protected function resetFlare()
- {
- $this->app->get(SentReports::class)->clear();
- $this->app->get(Flare::class)->reset();
-
- if (config('flare.reporting.report_logs', true)) {
- $this->app->make(LogRecorder::class)->reset();
- }
-
- if (config('flare.reporting.report_queries', true)) {
- $this->app->make(QueryRecorder::class)->reset();
- }
-
- if ($this->app->runningInConsole()) {
- $this->app->make(JobRecorder::class)->reset();
- }
-
- $this->app->make(DumpRecorder::class)->reset();
- }
-
- protected function setupQueue(QueueManager $queue)
- {
- // Reset before executing a queue job to make sure the job's log/query/dump recorders are empty.
- // When using a sync queue this also reports the queued reports from previous exceptions.
- $queue->before(function () {
- $this->resetFlare();
- });
-
- // Send queued reports (and reset) after executing a queue job.
- $queue->after(function () {
- $this->resetFlare();
- });
-
- // Note: the $queue->looping() event can't be used because it's not triggered on Vapor
- }
-
- /** @psalm-suppress UndefinedClass */
- protected function setupOctane()
- {
- $this->app['events']->listen(RequestReceived::class, function () {
- $this->resetFlare();
- });
-
- $this->app['events']->listen(TaskReceived::class, function () {
- $this->resetFlare();
- });
-
- $this->app['events']->listen(TickReceived::class, function () {
- $this->resetFlare();
- });
- }
-}
diff --git a/vendor/facade/ignition/src/LogRecorder/LogMessage.php b/vendor/facade/ignition/src/LogRecorder/LogMessage.php
deleted file mode 100644
index faf55be97..000000000
--- a/vendor/facade/ignition/src/LogRecorder/LogMessage.php
+++ /dev/null
@@ -1,47 +0,0 @@
-message = $message;
- $this->level = $level;
- $this->context = $context;
- $this->microtime = $microtime ?? microtime(true);
- }
-
- public static function fromMessageLoggedEvent(MessageLogged $event): self
- {
- return new self(
- $event->message,
- $event->level,
- $event->context
- );
- }
-
- public function toArray()
- {
- return [
- 'message' => $this->message,
- 'level' => $this->level,
- 'context' => $this->context,
- 'microtime' => $this->microtime,
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/Logger/FlareHandler.php b/vendor/facade/ignition/src/Logger/FlareHandler.php
deleted file mode 100644
index fdbdaffa7..000000000
--- a/vendor/facade/ignition/src/Logger/FlareHandler.php
+++ /dev/null
@@ -1,101 +0,0 @@
-flare = $flare;
-
- $this->sentReports = $sentReports;
-
- parent::__construct($level, $bubble);
- }
-
- public function setMinimumReportLogLevel(int $level)
- {
- if (! in_array($level, Logger::getLevels())) {
- throw new \InvalidArgumentException('The given minimum log level is not supported.');
- }
-
- $this->minimumReportLogLevel = $level;
- }
-
- protected function write(array $record): void
- {
- if (! $this->shouldReport($record)) {
- return;
- }
-
- if ($this->hasException($record)) {
- /** @var Throwable $throwable */
- $throwable = $record['context']['exception'];
-
- collect(Ignition::$tabs)
- ->each(function (Tab $tab) use ($throwable) {
- $tab->beforeRenderingErrorPage($this->flare, $throwable);
- });
-
- $report = $this->flare->report($record['context']['exception']);
-
- if ($report) {
- $this->sentReports->add($report);
- }
-
- return;
- }
-
- if (config('flare.send_logs_as_events')) {
- if ($this->hasValidLogLevel($record)) {
- $this->flare->reportMessage(
- $record['message'],
- 'Log ' . Logger::getLevelName($record['level']),
- function (Report $flareReport) use ($record) {
- foreach ($record['context'] as $key => $value) {
- $flareReport->context($key, $value);
- }
- }
- );
- }
- }
- }
-
- protected function shouldReport(array $report): bool
- {
- if (! config('flare.key')) {
- return false;
- }
-
- return $this->hasException($report) || $this->hasValidLogLevel($report);
- }
-
- protected function hasException(array $report): bool
- {
- $context = $report['context'];
-
- return isset($context['exception']) && $context['exception'] instanceof Throwable;
- }
-
- protected function hasValidLogLevel(array $report): bool
- {
- return $report['level'] >= $this->minimumReportLogLevel;
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddDumps.php b/vendor/facade/ignition/src/Middleware/AddDumps.php
deleted file mode 100644
index 8afffa6ff..000000000
--- a/vendor/facade/ignition/src/Middleware/AddDumps.php
+++ /dev/null
@@ -1,24 +0,0 @@
-dumpRecorder = $dumpRecorder;
- }
-
- public function handle(Report $report, $next)
- {
- $report->group('dumps', $this->dumpRecorder->getDumps());
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php b/vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php
deleted file mode 100644
index ed74ab637..000000000
--- a/vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php
+++ /dev/null
@@ -1,22 +0,0 @@
-frameworkVersion(app()->version());
-
- $report->group('env', [
- 'laravel_version' => app()->version(),
- 'laravel_locale' => app()->getLocale(),
- 'laravel_config_cached' => app()->configurationIsCached(),
- 'php_version' => phpversion(),
- ]);
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddExceptionInformation.php b/vendor/facade/ignition/src/Middleware/AddExceptionInformation.php
deleted file mode 100644
index c1ba2046e..000000000
--- a/vendor/facade/ignition/src/Middleware/AddExceptionInformation.php
+++ /dev/null
@@ -1,24 +0,0 @@
-getThrowable();
-
- if (! $throwable instanceof QueryException) {
- return $next($report);
- }
-
- $report->group('exception', [
- 'raw_sql' => $throwable->getSql(),
- ]);
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddGitInformation.php b/vendor/facade/ignition/src/Middleware/AddGitInformation.php
deleted file mode 100644
index c1f43564c..000000000
--- a/vendor/facade/ignition/src/Middleware/AddGitInformation.php
+++ /dev/null
@@ -1,57 +0,0 @@
-group('git', [
- 'hash' => $this->hash(),
- 'message' => $this->message(),
- 'tag' => $this->tag(),
- 'remote' => $this->remote(),
- ]);
- } catch (RuntimeException $exception) {
- }
-
- return $next($report);
- }
-
- public function hash(): ?string
- {
- return $this->command("git log --pretty=format:'%H' -n 1");
- }
-
- public function message(): ?string
- {
- return $this->command("git log --pretty=format:'%s' -n 1");
- }
-
- public function tag(): ?string
- {
- return $this->command('git describe --tags --abbrev=0');
- }
-
- public function remote(): ?string
- {
- return $this->command('git config --get remote.origin.url');
- }
-
- protected function command($command)
- {
- $process = (new ReflectionClass(Process::class))->hasMethod('fromShellCommandline')
- ? Process::fromShellCommandline($command, base_path())
- : new Process($command, base_path());
-
- $process->run();
-
- return trim($process->getOutput());
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddJobInformation.php b/vendor/facade/ignition/src/Middleware/AddJobInformation.php
deleted file mode 100644
index 1143e1c5c..000000000
--- a/vendor/facade/ignition/src/Middleware/AddJobInformation.php
+++ /dev/null
@@ -1,26 +0,0 @@
-jobRecorder = $jobRecorder;
- }
-
- public function handle(Report $report, $next)
- {
- if ($this->jobRecorder->getJob()) {
- $report->group('job', $this->jobRecorder->toArray());
- }
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddLogs.php b/vendor/facade/ignition/src/Middleware/AddLogs.php
deleted file mode 100644
index ea1d320cc..000000000
--- a/vendor/facade/ignition/src/Middleware/AddLogs.php
+++ /dev/null
@@ -1,24 +0,0 @@
-logRecorder = $logRecorder;
- }
-
- public function handle(Report $report, $next)
- {
- $report->group('logs', $this->logRecorder->getLogMessages());
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddQueries.php b/vendor/facade/ignition/src/Middleware/AddQueries.php
deleted file mode 100644
index f55094fe6..000000000
--- a/vendor/facade/ignition/src/Middleware/AddQueries.php
+++ /dev/null
@@ -1,24 +0,0 @@
-queryRecorder = $queryRecorder;
- }
-
- public function handle(Report $report, $next)
- {
- $report->group('queries', $this->queryRecorder->getQueries());
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/AddSolutions.php b/vendor/facade/ignition/src/Middleware/AddSolutions.php
deleted file mode 100644
index e0dc7ec66..000000000
--- a/vendor/facade/ignition/src/Middleware/AddSolutions.php
+++ /dev/null
@@ -1,30 +0,0 @@
-solutionProviderRepository = $solutionProviderRepository;
- }
-
- public function handle(Report $report, $next)
- {
- if ($throwable = $report->getThrowable()) {
- $solutions = $this->solutionProviderRepository->getSolutionsForThrowable($throwable);
-
- foreach ($solutions as $solution) {
- $report->addSolution($solution);
- }
- }
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/Middleware/SetNotifierName.php b/vendor/facade/ignition/src/Middleware/SetNotifierName.php
deleted file mode 100644
index 7b5740d43..000000000
--- a/vendor/facade/ignition/src/Middleware/SetNotifierName.php
+++ /dev/null
@@ -1,17 +0,0 @@
-notifierName(static::NOTIFIER_NAME);
-
- return $next($report);
- }
-}
diff --git a/vendor/facade/ignition/src/QueryRecorder/Query.php b/vendor/facade/ignition/src/QueryRecorder/Query.php
deleted file mode 100644
index 988857595..000000000
--- a/vendor/facade/ignition/src/QueryRecorder/Query.php
+++ /dev/null
@@ -1,58 +0,0 @@
-sql,
- $queryExecuted->time,
- $queryExecuted->connectionName ?? '',
- $reportBindings ? $queryExecuted->bindings : null
- );
- }
-
- protected function __construct(
- string $sql,
- float $time,
- string $connectionName,
- ?array $bindings = null,
- ?float $microtime = null
- ) {
- $this->sql = $sql;
- $this->time = $time;
- $this->connectionName = $connectionName;
- $this->bindings = $bindings;
- $this->microtime = $microtime ?? microtime(true);
- }
-
- public function toArray(): array
- {
- return [
- 'sql' => $this->sql,
- 'time' => $this->time,
- 'connection_name' => $this->connectionName,
- 'bindings' => $this->bindings,
- 'microtime' => $this->microtime,
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php b/vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php
deleted file mode 100644
index 423d67c7e..000000000
--- a/vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php
+++ /dev/null
@@ -1,87 +0,0 @@
-app = $app;
- $this->reportBindings = $reportBindings;
- $this->maxQueries = $maxQueries;
- }
-
- public function register()
- {
- $this->app['events']->listen(QueryExecuted::class, [$this, 'record']);
-
- return $this;
- }
-
- public function record(QueryExecuted $queryExecuted)
- {
- $this->queries[] = Query::fromQueryExecutedEvent($queryExecuted, $this->reportBindings);
-
- if (is_int($this->maxQueries)) {
- $this->queries = array_slice($this->queries, -$this->maxQueries);
- }
- }
-
- public function getQueries(): array
- {
- $queries = [];
-
- foreach ($this->queries as $query) {
- $queries[] = $query->toArray();
- }
-
- return $queries;
- }
-
- public function reset()
- {
- $this->queries = [];
- }
-
- public function getReportBindings(): bool
- {
- return $this->reportBindings;
- }
-
- public function setReportBindings(bool $reportBindings): self
- {
- $this->reportBindings = $reportBindings;
-
- return $this;
- }
-
- public function getMaxQueries(): ?int
- {
- return $this->maxQueries;
- }
-
- public function setMaxQueries(?int $maxQueries): self
- {
- $this->maxQueries = $maxQueries;
-
- return $this;
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php
deleted file mode 100644
index 4aa85871d..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php
+++ /dev/null
@@ -1,79 +0,0 @@
-getClassAndMethodFromExceptionMessage($throwable->getMessage()))) {
- return false;
- }
-
- return true;
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [
- BaseSolution::create('Bad Method Call')
- ->setSolutionDescription($this->getSolutionDescription($throwable)),
- ];
- }
-
- public function getSolutionDescription(Throwable $throwable): string
- {
- if (! $this->canSolve($throwable)) {
- return '';
- }
-
- extract($this->getClassAndMethodFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE);
-
- $possibleMethod = $this->findPossibleMethod($class, $method);
-
- return "Did you mean {$class}::{$possibleMethod->name}() ?";
- }
-
- protected function getClassAndMethodFromExceptionMessage(string $message): ?array
- {
- if (! preg_match(self::REGEX, $message, $matches)) {
- return null;
- }
-
- return [
- 'class' => $matches[1],
- 'method' => $matches[2],
- ];
- }
-
- protected function findPossibleMethod(string $class, string $invalidMethodName)
- {
- return $this->getAvailableMethods($class)
- ->sortByDesc(function (ReflectionMethod $method) use ($invalidMethodName) {
- similar_text($invalidMethodName, $method->name, $percentage);
-
- return $percentage;
- })->first();
- }
-
- protected function getAvailableMethods($class): Collection
- {
- $class = new ReflectionClass($class);
-
- return Collection::make($class->getMethods());
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php
deleted file mode 100644
index 77f904e8c..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php
+++ /dev/null
@@ -1,35 +0,0 @@
-getCode() !== self::MYSQL_UNKNOWN_DATABASE_CODE) {
- return false;
- }
-
- if (! in_array(env('DB_DATABASE'), ['homestead', 'laravel'])) {
- return false;
- }
-
- return true;
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [new SuggestUsingCorrectDbNameSolution()];
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php
deleted file mode 100644
index c0648dca0..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php
+++ /dev/null
@@ -1,25 +0,0 @@
-getMessage() === 'No application encryption key has been specified.';
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [new GenerateAppKeySolution()];
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php
deleted file mode 100644
index 27b2a5d3f..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php
+++ /dev/null
@@ -1,35 +0,0 @@
-isBadTableErrorCode($throwable->getCode());
- }
-
- protected function isBadTableErrorCode($code): bool
- {
- return $code === static::MYSQL_BAD_FIELD_CODE;
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [new RunMigrationsSolution('A column was not found')];
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php
deleted file mode 100644
index 55aaadc96..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php
+++ /dev/null
@@ -1,48 +0,0 @@
-getMessage(), $matches)) {
- return false;
- }
-
- $class = $matches[1];
-
- $this->composerClassMap = new ComposerClassMap();
-
- $this->search($class);
-
- return ! is_null($this->foundClass);
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [new SuggestImportSolution($this->foundClass)];
- }
-
- protected function search(string $missingClass)
- {
- $this->foundClass = $this->composerClassMap->searchClassMap($missingClass);
-
- if (is_null($this->foundClass)) {
- $this->foundClass = $this->composerClassMap->searchPsrMaps($missingClass);
- }
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingMixManifestSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingMixManifestSolutionProvider.php
deleted file mode 100644
index 224501fe7..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/MissingMixManifestSolutionProvider.php
+++ /dev/null
@@ -1,24 +0,0 @@
-getMessage(), 'The Mix manifest does not exist');
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [
- BaseSolution::create('Missing Mix Manifest File')
- ->setSolutionDescription('Did you forget to run `npm ci && npm run dev`?'),
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php
deleted file mode 100644
index 2eed04100..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php
+++ /dev/null
@@ -1,58 +0,0 @@
-getMessage(), $matches)) {
- return false;
- }
-
- $class = $matches[1];
-
- if (Str::startsWith($class, app()->getNamespace())) {
- return false;
- }
-
- $this->package = $this->findPackageFromClassName($class);
-
- return ! is_null($this->package);
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [new MissingPackageSolution($this->package)];
- }
-
- protected function findPackageFromClassName(string $missingClassName): ?Package
- {
- if (! $package = $this->findComposerPackageForClassName($missingClassName)) {
- return null;
- }
-
- return $package->hasNamespaceThatContainsClassName($missingClassName)
- ? $package
- : null;
- }
-
- protected function findComposerPackageForClassName(string $className): ?Package
- {
- $packages = Packagist::findPackagesForClassName($className);
-
- return $packages[0] ?? null;
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php
deleted file mode 100644
index b866d6169..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php
+++ /dev/null
@@ -1,63 +0,0 @@
-=')) {
- if (! $throwable instanceof RouteNotFoundException) {
- return false;
- }
- }
-
- if (version_compare(Application::VERSION, '6.0.0', '<')) {
- if (! $throwable instanceof InvalidArgumentException && ! $throwable instanceof ViewException) {
- return false;
- }
- }
-
- return (bool)preg_match(self::REGEX, $throwable->getMessage(), $matches);
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- preg_match(self::REGEX, $throwable->getMessage(), $matches);
-
- $missingRoute = $matches[1] ?? null;
-
- $suggestedRoute = $this->findRelatedRoute($missingRoute);
-
- if ($suggestedRoute) {
- return [
- BaseSolution::create("{$missingRoute} was not defined.")
- ->setSolutionDescription("Did you mean `{$suggestedRoute}`?"),
- ];
- }
-
- return [
- BaseSolution::create("{$missingRoute} was not defined.")
- ->setSolutionDescription('Are you sure that the route is defined'),
- ];
- }
-
- protected function findRelatedRoute(string $missingRoute): ?string
- {
- Route::getRoutes()->refreshNameLookups();
-
- return StringComparator::findClosestMatch(array_keys(Route::getRoutes()->getRoutesByName()), $missingRoute);
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php b/vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php
deleted file mode 100644
index e1474835a..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php
+++ /dev/null
@@ -1,30 +0,0 @@
-getMessage() === 'It is unsafe to run Dusk in production.';
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [
- BaseSolution::create('Laravel Dusk should not be run in production.')
- ->setSolutionDescription('Install the dependencies with the `--no-dev` flag.'),
- BaseSolution::create('Laravel Dusk can be run in other environments.')
- ->setSolutionDescription('Consider setting the `APP_ENV` to something other than `production` like `local` for example.'),
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php b/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php
deleted file mode 100644
index 01b2ca900..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php
+++ /dev/null
@@ -1,95 +0,0 @@
-solutionProviders = Collection::make($solutionProviders);
- }
-
- public function registerSolutionProvider(string $solutionProviderClass): SolutionProviderRepositoryContract
- {
- $this->solutionProviders->push($solutionProviderClass);
-
- return $this;
- }
-
- public function registerSolutionProviders(array $solutionProviderClasses): SolutionProviderRepositoryContract
- {
- $this->solutionProviders = $this->solutionProviders->merge($solutionProviderClasses);
-
- return $this;
- }
-
- public function getSolutionsForThrowable(Throwable $throwable): array
- {
- $solutions = [];
-
- if ($throwable instanceof Solution) {
- $solutions[] = $throwable;
- }
-
- if ($throwable instanceof ProvidesSolution) {
- $solutions[] = $throwable->getSolution();
- }
-
- $providedSolutions = $this->solutionProviders
- ->filter(function (string $solutionClass) {
- if (! in_array(HasSolutionsForThrowable::class, class_implements($solutionClass))) {
- return false;
- }
-
- if (in_array($solutionClass, config('ignition.ignored_solution_providers', []))) {
- return false;
- }
-
- return true;
- })
- ->map(function (string $solutionClass) {
- return app($solutionClass);
- })
- ->filter(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) {
- try {
- return $solutionProvider->canSolve($throwable);
- } catch (Throwable $e) {
- return false;
- }
- })
- ->map(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) {
- try {
- return $solutionProvider->getSolutions($throwable);
- } catch (Throwable $e) {
- return [];
- }
- })
- ->flatten()
- ->toArray();
-
- return array_merge($solutions, $providedSolutions);
- }
-
- public function getSolutionForClass(string $solutionClass): ?Solution
- {
- if (! class_exists($solutionClass)) {
- return null;
- }
-
- if (! in_array(Solution::class, class_implements($solutionClass))) {
- return null;
- }
-
- return app($solutionClass);
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php
deleted file mode 100644
index e4e5d7a8f..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php
+++ /dev/null
@@ -1,35 +0,0 @@
-isBadTableErrorCode($throwable->getCode());
- }
-
- protected function isBadTableErrorCode($code): bool
- {
- return $code === static::MYSQL_BAD_TABLE_CODE;
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [new RunMigrationsSolution('A table was not found')];
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UndefinedPropertySolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UndefinedPropertySolutionProvider.php
deleted file mode 100644
index 09ea19b11..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/UndefinedPropertySolutionProvider.php
+++ /dev/null
@@ -1,98 +0,0 @@
-getClassAndPropertyFromExceptionMessage($throwable->getMessage()))) {
- return false;
- }
-
- if (! $this->similarPropertyExists($throwable)) {
- return false;
- }
-
- return true;
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [
- BaseSolution::create('Unknown Property')
- ->setSolutionDescription($this->getSolutionDescription($throwable)),
- ];
- }
-
- public function getSolutionDescription(Throwable $throwable): string
- {
- if (! $this->canSolve($throwable) || ! $this->similarPropertyExists($throwable)) {
- return '';
- }
-
- extract($this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE);
-
- $possibleProperty = $this->findPossibleProperty($class, $property);
-
- return "Did you mean {$class}::\${$possibleProperty->name} ?";
- }
-
- protected function similarPropertyExists(Throwable $throwable)
- {
- extract($this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE);
-
- $possibleProperty = $this->findPossibleProperty($class, $property);
-
- return $possibleProperty !== null;
- }
-
- protected function getClassAndPropertyFromExceptionMessage(string $message): ?array
- {
- if (! preg_match(self::REGEX, $message, $matches)) {
- return null;
- }
-
- return [
- 'class' => $matches[1],
- 'property' => $matches[2],
- ];
- }
-
- protected function findPossibleProperty(string $class, string $invalidPropertyName)
- {
- return $this->getAvailableProperties($class)
- ->sortByDesc(function (ReflectionProperty $property) use ($invalidPropertyName) {
- similar_text($invalidPropertyName, $property->name, $percentage);
-
- return $percentage;
- })
- ->filter(function (ReflectionProperty $property) use ($invalidPropertyName) {
- similar_text($invalidPropertyName, $property->name, $percentage);
-
- return $percentage >= self::MINIMUM_SIMILARITY;
- })->first();
- }
-
- protected function getAvailableProperties($class): Collection
- {
- $class = new ReflectionClass($class);
-
- return Collection::make($class->getProperties());
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php
deleted file mode 100644
index 8a6917b17..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php
+++ /dev/null
@@ -1,95 +0,0 @@
-getNameAndView($throwable) !== null;
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- $solutions = [];
-
- extract($this->getNameAndView($throwable));
-
- if (! isset($variableName)) {
- return [];
- }
-
- $solutions = $this->findCorrectVariableSolutions($throwable, $variableName, $viewFile);
- $solutions[] = $this->findOptionalVariableSolution($variableName, $viewFile);
-
- return $solutions;
- }
-
- protected function findCorrectVariableSolutions(
- ViewException $throwable,
- string $variableName,
- string $viewFile
- ): array {
- return collect($throwable->getViewData())
- ->map(function ($value, $key) use ($variableName) {
- similar_text($variableName, $key, $percentage);
-
- return ['match' => $percentage, 'value' => $value];
- })
- ->sortByDesc('match')->filter(function ($var) {
- return $var['match'] > 40;
- })
- ->keys()
- ->map(function ($suggestion) use ($variableName, $viewFile) {
- return new SuggestCorrectVariableNameSolution($variableName, $viewFile, $suggestion);
- })
- ->map(function ($solution) {
- return $solution->isRunnable()
- ? $solution
- : BaseSolution::create($solution->getSolutionTitle())
- ->setSolutionDescription($solution->getSolutionDescription());
- })
- ->toArray();
- }
-
- protected function findOptionalVariableSolution(string $variableName, string $viewFile)
- {
- $optionalSolution = new MakeViewVariableOptionalSolution($variableName, $viewFile);
-
- return $optionalSolution->isRunnable()
- ? $optionalSolution
- : BaseSolution::create($optionalSolution->getSolutionTitle())
- ->setSolutionDescription($optionalSolution->getSolutionDescription());
- }
-
- protected function getNameAndView(Throwable $throwable): ?array
- {
- $pattern = '/Undefined variable:? (.*?) \(View: (.*?)\)/';
-
- preg_match($pattern, $throwable->getMessage(), $matches);
-
- if (count($matches) === 3) {
- [, $variableName, $viewFile] = $matches;
- $variableName = ltrim($variableName, '$');
-
- return compact('variableName', 'viewFile');
- }
-
- return null;
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php
deleted file mode 100644
index 99d3e24b0..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php
+++ /dev/null
@@ -1,83 +0,0 @@
-validate(?!(Attribute|UsingCustomRule))[A-Z][a-zA-Z]+)/m';
-
- public function canSolve(Throwable $throwable): bool
- {
- if (! $throwable instanceof BadMethodCallException) {
- return false;
- }
-
- return ! is_null($this->getMethodFromExceptionMessage($throwable->getMessage()));
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- return [
- BaseSolution::create('Unknown Validation Rule')
- ->setSolutionDescription($this->getSolutionDescription($throwable)),
- ];
- }
-
- protected function getSolutionDescription(Throwable $throwable): string
- {
- $method = $this->getMethodFromExceptionMessage($throwable->getMessage());
-
- $possibleMethod = StringComparator::findSimilarText(
- $this->getAvailableMethods()->toArray(),
- $method
- );
-
- if (empty($possibleMethod)) {
- return '';
- }
-
- $rule = Str::snake(str_replace('validate', '', $possibleMethod));
-
- return "Did you mean `{$rule}` ?";
- }
-
- protected function getMethodFromExceptionMessage(string $message): ?string
- {
- if (! preg_match(self::REGEX, $message, $matches)) {
- return null;
- }
-
- return $matches['method'];
- }
-
- protected function getAvailableMethods(): Collection
- {
- $class = new ReflectionClass(Validator::class);
-
- $extensions = Collection::make((app('validator')->make([], []))->extensions)
- ->keys()
- ->map(function (string $extension) {
- return 'validate'.Str::studly($extension);
- });
-
- return Collection::make($class->getMethods())
- ->filter(function (ReflectionMethod $method) {
- return preg_match('/(validate(?!(Attribute|UsingCustomRule))[A-Z][a-zA-Z]+)/', $method->name);
- })
- ->map(function (ReflectionMethod $method) {
- return $method->name;
- })
- ->merge($extensions);
- }
-}
diff --git a/vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php
deleted file mode 100644
index cd24e8550..000000000
--- a/vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php
+++ /dev/null
@@ -1,124 +0,0 @@
-getMessage(), $matches);
- }
-
- public function getSolutions(Throwable $throwable): array
- {
- preg_match(self::REGEX, $throwable->getMessage(), $matches);
-
- $missingView = $matches[1] ?? null;
-
- $suggestedView = $this->findRelatedView($missingView);
-
- if ($suggestedView == $missingView) {
- return [
- BaseSolution::create("{$missingView} was not found.")
- ->setSolutionDescription('View names should not contain the . character!'),
- ];
- }
-
- if ($suggestedView) {
- return [
- BaseSolution::create("{$missingView} was not found.")
- ->setSolutionDescription("Did you mean `{$suggestedView}`?"),
- ];
- }
-
- return [
- BaseSolution::create("{$missingView} was not found.")
- ->setSolutionDescription('Are you sure the view exists and is a `.blade.php` file?'),
- ];
- }
-
- protected function findRelatedView(string $missingView): ?string
- {
- $views = $this->getAllViews();
-
- return StringComparator::findClosestMatch($views, $missingView);
- }
-
- protected function getAllViews(): array
- {
- /** @var \Illuminate\View\FileViewFinder $fileViewFinder */
- $fileViewFinder = View::getFinder();
-
- $extensions = $fileViewFinder->getExtensions();
-
- $viewsForHints = collect($fileViewFinder->getHints())
- ->flatMap(function ($paths, string $namespace) use ($extensions) {
- $paths = Arr::wrap($paths);
-
- return collect($paths)
- ->flatMap(function (string $path) use ($extensions) {
- return $this->getViewsInPath($path, $extensions);
- })
- ->map(function (string $view) use ($namespace) {
- return "{$namespace}::{$view}";
- })
- ->toArray();
- });
-
- $viewsForViewPaths = collect($fileViewFinder->getPaths())
- ->flatMap(function (string $path) use ($extensions) {
- return $this->getViewsInPath($path, $extensions);
- });
-
- return $viewsForHints->merge($viewsForViewPaths)->toArray();
- }
-
- protected function getViewsInPath(string $path, array $extensions): array
- {
- $filePatterns = array_map(function (string $extension) {
- return "*.{$extension}";
- }, $extensions);
-
- $extensionsWithDots = array_map(function (string $extension) {
- return ".{$extension}";
- }, $extensions);
-
- $files = (new Finder())
- ->in($path)
- ->files();
-
- foreach ($filePatterns as $filePattern) {
- $files->name($filePattern);
- }
-
- $views = [];
-
- foreach ($files as $file) {
- if ($file instanceof SplFileInfo) {
- $view = $file->getRelativePathname();
- $view = str_replace($extensionsWithDots, '', $view);
- $view = str_replace('/', '.', $view);
- $views[] = $view;
- }
- }
-
- return $views;
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/LivewireDiscoverSolution.php b/vendor/facade/ignition/src/Solutions/LivewireDiscoverSolution.php
deleted file mode 100644
index 87b5c0bb9..000000000
--- a/vendor/facade/ignition/src/Solutions/LivewireDiscoverSolution.php
+++ /dev/null
@@ -1,53 +0,0 @@
-customTitle = $customTitle;
- }
-
- public function getSolutionTitle(): string
- {
- return $this->customTitle;
- }
-
- public function getSolutionDescription(): string
- {
- return 'You might have forgotten to discover your Livewire components. You can discover your Livewire components using `php artisan livewire:discover`.';
- }
-
- public function getDocumentationLinks(): array
- {
- return [
- 'Livewire: Artisan Commands' => 'https://laravel-livewire.com/docs/2.x/artisan-commands',
- ];
- }
-
- public function getRunParameters(): array
- {
- return [];
- }
-
- public function getSolutionActionDescription(): string
- {
- return 'Pressing the button below will try to discover your Livewire components.';
- }
-
- public function getRunButtonText(): string
- {
- return 'Run livewire:discover';
- }
-
- public function run(array $parameters = [])
- {
- app(LivewireComponentsFinder::class)->build();
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/MissingPackageSolution.php b/vendor/facade/ignition/src/Solutions/MissingPackageSolution.php
deleted file mode 100644
index 832597c9d..000000000
--- a/vendor/facade/ignition/src/Solutions/MissingPackageSolution.php
+++ /dev/null
@@ -1,42 +0,0 @@
-possiblePackage = $possiblePackage;
- }
-
- public function getSolutionTitle(): string
- {
- return 'A composer dependency is missing';
- }
-
- public function getSolutionDescription(): string
- {
- $output = [
- 'You might be missing a composer dependency.',
- 'A possible package that was found is `'.$this->possiblePackage->name.'`.',
- '',
- 'See if this is the package that you need and install it via `composer require '.$this->possiblePackage->name.'`.',
- ];
-
- return implode(PHP_EOL, $output);
- }
-
- public function getDocumentationLinks(): array
- {
- return [
- 'Git repository' => $this->possiblePackage->repository,
- 'Package on Packagist' => $this->possiblePackage->url,
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php b/vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php
deleted file mode 100644
index 29f391bd7..000000000
--- a/vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php
+++ /dev/null
@@ -1,53 +0,0 @@
-customTitle = $customTitle;
- }
-
- public function getSolutionTitle(): string
- {
- return $this->customTitle;
- }
-
- public function getSolutionDescription(): string
- {
- return 'You might have forgotten to run your migrations. You can run your migrations using `php artisan migrate`.';
- }
-
- public function getDocumentationLinks(): array
- {
- return [
- 'Database: Running Migrations docs' => 'https://laravel.com/docs/master/migrations#running-migrations',
- ];
- }
-
- public function getRunParameters(): array
- {
- return [];
- }
-
- public function getSolutionActionDescription(): string
- {
- return 'Pressing the button below will try to run your migrations.';
- }
-
- public function getRunButtonText(): string
- {
- return 'Run migrations';
- }
-
- public function run(array $parameters = [])
- {
- Artisan::call('migrate');
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/SolutionTransformer.php b/vendor/facade/ignition/src/Solutions/SolutionTransformer.php
deleted file mode 100644
index db2080cd1..000000000
--- a/vendor/facade/ignition/src/Solutions/SolutionTransformer.php
+++ /dev/null
@@ -1,45 +0,0 @@
-solution = $solution;
- }
-
- public function toArray(): array
- {
- $isRunnable = ($this->solution instanceof RunnableSolution);
-
- return [
- 'class' => get_class($this->solution),
- 'title' => $this->solution->getSolutionTitle(),
- 'description' => $this->solution->getSolutionDescription(),
- 'links' => $this->solution->getDocumentationLinks(),
- 'is_runnable' => $isRunnable,
- 'run_button_text' => $isRunnable ? $this->solution->getRunButtonText() : '',
- 'run_parameters' => $isRunnable ? $this->solution->getRunParameters() : [],
- 'action_description' => $isRunnable ? $this->solution->getSolutionActionDescription() : '',
- 'execute_endpoint' => $this->executeEndpoint(),
- ];
- }
-
- protected function executeEndpoint(): string
- {
- try {
- return action('\Facade\Ignition\Http\Controllers\ExecuteSolutionController');
- } catch (Throwable $exception) {
- return '';
- }
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php
deleted file mode 100644
index e16817683..000000000
--- a/vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php
+++ /dev/null
@@ -1,44 +0,0 @@
-variableName = $variableName;
- $this->viewFile = $viewFile;
- $this->suggested = $suggested;
- }
-
- public function getSolutionTitle(): string
- {
- return 'Possible typo $'.$this->variableName;
- }
-
- public function getDocumentationLinks(): array
- {
- return [];
- }
-
- public function getSolutionDescription(): string
- {
- return "Did you mean `$$this->suggested`?";
- }
-
- public function isRunnable(): bool
- {
- return false;
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestImportSolution.php b/vendor/facade/ignition/src/Solutions/SuggestImportSolution.php
deleted file mode 100644
index 7779c97ac..000000000
--- a/vendor/facade/ignition/src/Solutions/SuggestImportSolution.php
+++ /dev/null
@@ -1,31 +0,0 @@
-class = $class;
- }
-
- public function getSolutionTitle(): string
- {
- return 'A class import is missing';
- }
-
- public function getSolutionDescription(): string
- {
- return 'You have a missing class import. Try importing this class: `'.$this->class.'`.';
- }
-
- public function getDocumentationLinks(): array
- {
- return [];
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestLivewireMethodNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestLivewireMethodNameSolution.php
deleted file mode 100644
index 3c39b9bdb..000000000
--- a/vendor/facade/ignition/src/Solutions/SuggestLivewireMethodNameSolution.php
+++ /dev/null
@@ -1,44 +0,0 @@
-methodName = $methodName;
- $this->componentClass = $componentClass;
- $this->suggested = $suggested;
- }
-
- public function getSolutionTitle(): string
- {
- return "Possible typo `{$this->componentClass}::{$this->methodName}()`";
- }
-
- public function getDocumentationLinks(): array
- {
- return [];
- }
-
- public function getSolutionDescription(): string
- {
- return "Did you mean `{$this->suggested}()`?";
- }
-
- public function isRunnable(): bool
- {
- return false;
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestLivewirePropertyNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestLivewirePropertyNameSolution.php
deleted file mode 100644
index 198152edc..000000000
--- a/vendor/facade/ignition/src/Solutions/SuggestLivewirePropertyNameSolution.php
+++ /dev/null
@@ -1,44 +0,0 @@
-variableName = $variableName;
- $this->componentClass = $componentClass;
- $this->suggested = $suggested;
- }
-
- public function getSolutionTitle(): string
- {
- return "Possible typo {$this->componentClass}::{$this->variableName}";
- }
-
- public function getDocumentationLinks(): array
- {
- return [];
- }
-
- public function getSolutionDescription(): string
- {
- return "Did you mean `$this->suggested`?";
- }
-
- public function isRunnable(): bool
- {
- return false;
- }
-}
diff --git a/vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php b/vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php
deleted file mode 100644
index d0c40362f..000000000
--- a/vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php
+++ /dev/null
@@ -1,64 +0,0 @@
-ensureLineExists('DB_USERNAME', 'root');
- $this->ensureLineExists('DB_PASSWORD', '');
- }
-
- protected function ensureLineExists(string $key, string $value)
- {
- $envPath = base_path('.env');
-
- $envLines = array_map(function (string $envLine) use ($value, $key) {
- return Str::startsWith($envLine, $key)
- ? "{$key}={$value}".PHP_EOL
- : $envLine;
- }, file($envPath));
-
- file_put_contents($envPath, implode('', $envLines));
- }
-
- public function getDocumentationLinks(): array
- {
- return [];
- }
-
- public function getRunParameters(): array
- {
- return [
- 'Valet documentation' => 'https://laravel.com/docs/master/valet',
- ];
- }
-
- public function getSolutionDescription(): string
- {
- return 'You seem to be using Valet, but the .env file does not contain the right default database credentials.';
- }
-}
diff --git a/vendor/facade/ignition/src/Support/FakeComposer.php b/vendor/facade/ignition/src/Support/FakeComposer.php
deleted file mode 100644
index ac7259316..000000000
--- a/vendor/facade/ignition/src/Support/FakeComposer.php
+++ /dev/null
@@ -1,21 +0,0 @@
-version(), 0, 1);
- }
-}
diff --git a/vendor/facade/ignition/src/Support/LivewireComponentParser.php b/vendor/facade/ignition/src/Support/LivewireComponentParser.php
deleted file mode 100644
index 4a4ba86b9..000000000
--- a/vendor/facade/ignition/src/Support/LivewireComponentParser.php
+++ /dev/null
@@ -1,97 +0,0 @@
-componentAlias = $componentAlias;
- $this->componentClass = app(LivewireManager::class)->getClass($this->componentAlias);
- $this->reflectionClass = new ReflectionClass($this->componentClass);
- }
-
- public function getComponentClass(): string
- {
- return $this->componentClass;
- }
-
- public function getPropertyNamesLike(string $similar): Collection
- {
- $properties = collect($this->reflectionClass->getProperties(ReflectionProperty::IS_PUBLIC))
- ->reject(function (ReflectionProperty $reflectionProperty) {
- return $reflectionProperty->class !== $this->reflectionClass->name;
- })
- ->map(function (ReflectionProperty $reflectionProperty) {
- return $reflectionProperty->name;
- });
-
- $computedProperties = collect($this->reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC))
- ->reject(function (ReflectionMethod $reflectionMethod) {
- return $reflectionMethod->class !== $this->reflectionClass->name;
- })
- ->filter(function (ReflectionMethod $reflectionMethod) {
- return str_starts_with($reflectionMethod->name, 'get') && str_ends_with($reflectionMethod->name, 'Property');
- })
- ->map(function (ReflectionMethod $reflectionMethod) {
- return lcfirst(Str::of($reflectionMethod->name)->after('get')->before('Property'));
- });
-
- return $this->filterItemsBySimilarity(
- $properties->merge($computedProperties),
- $similar
- );
- }
-
- public function getMethodNamesLike(string $similar): Collection
- {
- $methods = collect($this->reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC))
- ->reject(function (ReflectionMethod $reflectionMethod) {
- return $reflectionMethod->class !== $this->reflectionClass->name;
- })
- ->map(function (ReflectionMethod $reflectionMethod) {
- return $reflectionMethod->name;
- });
-
- return $this->filterItemsBySimilarity($methods, $similar);
- }
-
- protected function filterItemsBySimilarity(Collection $items, string $similar): Collection
- {
- return $items
- ->map(function (string $name) use ($similar) {
- similar_text($similar, $name, $percentage);
-
- return ['match' => $percentage, 'value' => $name];
- })
- ->sortByDesc('match')
- ->filter(function (array $item) {
- return $item['match'] > 40;
- })
- ->map(function (array $item) {
- return $item['value'];
- })
- ->values();
- }
-}
diff --git a/vendor/facade/ignition/src/Support/Packagist/Package.php b/vendor/facade/ignition/src/Support/Packagist/Package.php
deleted file mode 100644
index 27043f3b7..000000000
--- a/vendor/facade/ignition/src/Support/Packagist/Package.php
+++ /dev/null
@@ -1,50 +0,0 @@
-name = $properties['name'];
-
- $this->url = $properties['url'];
-
- $this->repository = $properties['repository'];
- }
-
- public function hasNamespaceThatContainsClassName(string $className): bool
- {
- return $this->getNamespaces()->contains(function ($namespace) use ($className) {
- return Str::startsWith(strtolower($className), strtolower($namespace));
- });
- }
-
- protected function getNamespaces(): Collection
- {
- $details = json_decode(file_get_contents("https://packagist.org/packages/{$this->name}.json"), true);
-
- return collect($details['package']['versions'])
- ->map(function ($version) {
- return collect($version['autoload'] ?? [])
- ->map(function ($autoload) {
- return array_keys($autoload);
- })
- ->flatten();
- })
- ->flatten()
- ->unique();
- }
-}
diff --git a/vendor/facade/ignition/src/Support/Packagist/Packagist.php b/vendor/facade/ignition/src/Support/Packagist/Packagist.php
deleted file mode 100644
index a6f481e3a..000000000
--- a/vendor/facade/ignition/src/Support/Packagist/Packagist.php
+++ /dev/null
@@ -1,29 +0,0 @@
-results);
- }
-}
diff --git a/vendor/facade/ignition/src/Support/SentReports.php b/vendor/facade/ignition/src/Support/SentReports.php
deleted file mode 100644
index 3a9b54e49..000000000
--- a/vendor/facade/ignition/src/Support/SentReports.php
+++ /dev/null
@@ -1,57 +0,0 @@
- */
- protected $reports = [];
-
- public function add(Report $report): self
- {
- $this->reports[] = $report;
-
- return $this;
- }
-
- public function all(): array
- {
- return $this->reports;
- }
-
- public function uuids(): array
- {
- return array_map(function (Report $report) {
- return $report->trackingUuid();
- }, $this->reports);
- }
-
- public function urls(): array
- {
- return array_map(function (string $trackingUuid) {
- return "https://flareapp.io/tracked-occurrence/{$trackingUuid}";
- }, $this->uuids());
- }
-
- public function latestUuid(): ?string
- {
- if (! $latestReport = Arr::last($this->reports)) {
- return null;
- }
-
- return $latestReport->trackingUuid();
- }
-
- public function latestUrl(): ?string
- {
- return Arr::last($this->urls());
- }
-
- public function clear()
- {
- $this->reports = [];
- }
-}
diff --git a/vendor/facade/ignition/src/Tabs/Tab.php b/vendor/facade/ignition/src/Tabs/Tab.php
deleted file mode 100644
index d71bdc74c..000000000
--- a/vendor/facade/ignition/src/Tabs/Tab.php
+++ /dev/null
@@ -1,75 +0,0 @@
-registerAssets();
- }
-
- public function name(): string
- {
- return Str::studly(class_basename(get_called_class()));
- }
-
- public function component(): string
- {
- return Str::snake(class_basename(get_called_class()), '-');
- }
-
- public function beforeRenderingErrorPage(Flare $flare, Throwable $throwable)
- {
- $this->flare = $flare;
-
- $this->throwable = $throwable;
- }
-
- public function script(string $name, string $path)
- {
- $this->scripts[$name] = $path;
-
- return $this;
- }
-
- public function style(string $name, string $path)
- {
- $this->styles[$name] = $path;
-
- return $this;
- }
-
- abstract protected function registerAssets();
-
- public function meta(): array
- {
- return [];
- }
-
- public function jsonSerialize()
- {
- return [
- 'title' => $this->name(),
- 'component' => $this->component(),
- 'props' => [
- 'meta' => $this->meta(),
- ],
- ];
- }
-}
diff --git a/vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php b/vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php
deleted file mode 100644
index 415ff3461..000000000
--- a/vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php
+++ /dev/null
@@ -1,94 +0,0 @@
-compileString(file_get_contents($filename));
- } catch (ErrorException $e) {
- return 1;
- }
-
- $map = explode("\n", $map);
-
- $line = $map[$exceptionLineNumber - 1] ?? $exceptionLineNumber;
- $pattern = '/\|---LINE:([0-9]+)---\|/m';
-
- if (preg_match($pattern, (string)$line, $matches)) {
- return (int)$matches[1];
- }
-
- return $exceptionLineNumber;
- }
-
- public function compileString($value)
- {
- try {
- $value = $this->addEchoLineNumbers($value);
-
- $value = $this->addStatementLineNumbers($value);
-
- $value = parent::compileString($value);
-
- return $this->trimEmptyLines($value);
- } catch (\Exception $e) {
- return $value;
- }
- }
-
- protected function addEchoLineNumbers(string $value)
- {
- $pattern = sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', $this->contentTags[0], $this->contentTags[1]);
-
- if (preg_match_all($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) {
- foreach (array_reverse($matches[0]) as $match) {
- $position = mb_strlen(substr($value, 0, $match[1]));
-
- $value = $this->insertLineNumberAtPosition($position, $value);
- }
- }
-
- return $value;
- }
-
- protected function addStatementLineNumbers(string $value)
- {
- $shouldInsertLineNumbers = preg_match_all(
- '/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x',
- $value,
- $matches,
- PREG_OFFSET_CAPTURE
- );
-
- if ($shouldInsertLineNumbers) {
- foreach (array_reverse($matches[0]) as $match) {
- $position = mb_strlen(substr($value, 0, $match[1]));
-
- $value = $this->insertLineNumberAtPosition($position, $value);
- }
- }
-
- return $value;
- }
-
- protected function insertLineNumberAtPosition(int $position, string $value)
- {
- $before = mb_substr($value, 0, $position);
- $lineNumber = count(explode("\n", $before));
-
- return mb_substr($value, 0, $position)."|---LINE:{$lineNumber}---|".mb_substr($value, $position);
- }
-
- protected function trimEmptyLines(string $value)
- {
- $value = preg_replace('/^\|---LINE:([0-9]+)---\|$/m', '', $value);
-
- return ltrim($value, PHP_EOL);
- }
-}
diff --git a/vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php b/vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php
deleted file mode 100644
index e064842bb..000000000
--- a/vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php
+++ /dev/null
@@ -1,67 +0,0 @@
-lastCompiledData[] = [
- 'path' => $path,
- 'compiledPath' => $this->getCompiledPath($path),
- 'data' => $this->filterViewData($data),
- ];
- }
-
- public function filterViewData(array $data): array
- {
- // By default, Laravel views get two shared data keys:
- // __env and app. We try to filter them out.
- return array_filter($data, function ($value, $key) {
- if ($key === 'app') {
- return ! $value instanceof Application;
- }
-
- return $key !== '__env';
- }, ARRAY_FILTER_USE_BOTH);
- }
-
- public function getCompiledViewData($compiledPath): array
- {
- $compiledView = $this->findCompiledView($compiledPath);
-
- return $compiledView['data'] ?? [];
- }
-
- public function getCompiledViewName($compiledPath): string
- {
- $compiledView = $this->findCompiledView($compiledPath);
-
- return $compiledView['path'] ?? $compiledPath;
- }
-
- protected function findCompiledView($compiledPath): ?array
- {
- return Collection::make($this->lastCompiledData)
- ->first(function ($compiledData) use ($compiledPath) {
- $comparePath = $compiledData['compiledPath'];
-
- return realpath(dirname($comparePath)).DIRECTORY_SEPARATOR.basename($comparePath) === $compiledPath;
- });
- }
-
- protected function getCompiledPath($path): string
- {
- if ($this instanceof CompilerEngine) {
- return $this->getCompiler()->getCompiledPath($path);
- }
-
- return $path;
- }
-}
diff --git a/vendor/facade/ignition/src/Views/Engines/CompilerEngine.php b/vendor/facade/ignition/src/Views/Engines/CompilerEngine.php
deleted file mode 100644
index 59b028b95..000000000
--- a/vendor/facade/ignition/src/Views/Engines/CompilerEngine.php
+++ /dev/null
@@ -1,117 +0,0 @@
-currentPath = $path;
-
- $this->collectViewData($path, $data);
-
- return parent::get($path, $data);
- }
-
- /**
- * Handle a view exception.
- *
- * @param \Throwable $baseException
- * @param int $obLevel
- *
- * @return void
- *
- * @throws \Throwable
- */
- protected function handleViewException(Throwable $baseException, $obLevel)
- {
- while (ob_get_level() > $obLevel) {
- ob_end_clean();
- }
-
- if ($baseException instanceof ViewException) {
- throw $baseException;
- }
-
- $viewExceptionClass = ViewException::class;
-
- if ($baseException instanceof ProvidesSolution) {
- $viewExceptionClass = ViewExceptionWithSolution::class;
- }
-
- $exception = new $viewExceptionClass(
- $this->getMessage($baseException),
- 0,
- 1,
- $this->getCompiledViewName($baseException->getFile()),
- $this->getBladeLineNumber($baseException->getFile(), $baseException->getLine()),
- $baseException
- );
-
- if ($baseException instanceof ProvidesSolution) {
- $exception->setSolution($baseException->getSolution());
- }
-
-
- $this->modifyViewsInTrace($exception);
-
- $exception->setView($this->getCompiledViewName($baseException->getFile()));
- $exception->setViewData($this->getCompiledViewData($baseException->getFile()));
-
- throw $exception;
- }
-
- protected function getBladeLineNumber(string $compiledPath, int $exceptionLineNumber): int
- {
- $viewPath = $this->getCompiledViewName($compiledPath);
-
- if (! $viewPath) {
- return $exceptionLineNumber;
- }
-
- $sourceMapCompiler = new BladeSourceMapCompiler(app(Filesystem::class), 'not-needed');
-
- return $sourceMapCompiler->detectLineNumber($viewPath, $exceptionLineNumber);
- }
-
- protected function modifyViewsInTrace(ViewException $exception)
- {
- $trace = Collection::make($exception->getPrevious()->getTrace())
- ->map(function ($trace) {
- if ($compiledData = $this->findCompiledView(Arr::get($trace, 'file', ''))) {
- $trace['file'] = $compiledData['path'];
- $trace['line'] = $this->getBladeLineNumber($trace['file'], $trace['line']);
- }
-
- return $trace;
- })->toArray();
-
- $traceProperty = new ReflectionProperty('Exception', 'trace');
- $traceProperty->setAccessible(true);
- $traceProperty->setValue($exception, $trace);
- }
-}
diff --git a/vendor/facade/ignition/src/Views/Engines/PhpEngine.php b/vendor/facade/ignition/src/Views/Engines/PhpEngine.php
deleted file mode 100644
index 25ad8b517..000000000
--- a/vendor/facade/ignition/src/Views/Engines/PhpEngine.php
+++ /dev/null
@@ -1,47 +0,0 @@
-collectViewData($path, $data);
-
- return parent::get($path, $data);
- }
-
- /**
- * Handle a view exception.
- *
- * @param \Throwable $baseException
- * @param int $obLevel
- *
- * @return void
- *
- * @throws \Throwable
- */
- protected function handleViewException(Throwable $baseException, $obLevel)
- {
- $exception = new ViewException($baseException->getMessage(), 0, 1, $baseException->getFile(), $baseException->getLine(), $baseException);
-
- $exception->setView($this->getCompiledViewName($baseException->getFile()));
- $exception->setViewData($this->getCompiledViewData($baseException->getFile()));
-
- parent::handleViewException($exception, $obLevel);
- }
-}
diff --git a/vendor/facade/ignition/src/helpers.php b/vendor/facade/ignition/src/helpers.php
deleted file mode 100644
index 81b0992a6..000000000
--- a/vendor/facade/ignition/src/helpers.php
+++ /dev/null
@@ -1,31 +0,0 @@
-make(Flare::class);
-
- $report = $client->createReportFromMessage('Dump, Die, Debug', 'info');
-
- $handler->handleReport($report, 'DebugTab', [
- 'dump' => true,
- 'glow' => false,
- 'log' => false,
- 'query' => false,
- ]);
-
- die();
- }
-}
diff --git a/vendor/fakerphp/faker/CHANGELOG.md b/vendor/fakerphp/faker/CHANGELOG.md
index 3350f92c7..566ad322c 100644
--- a/vendor/fakerphp/faker/CHANGELOG.md
+++ b/vendor/fakerphp/faker/CHANGELOG.md
@@ -2,6 +2,11 @@
## [Unreleased](https://github.com/FakerPHP/Faker/compare/v1.20.0...main)
+## [2022-12-13, v1.21.0](https://github.com/FakerPHP/Faker/compare/v1.20.0..v1.21.0)
+
+- Dropped support for PHP 7.1, 7.2, and 7.3 (#543)
+- Added support for PHP 8.2 (#528)
+
## [2022-07-20, v1.20.0](https://github.com/FakerPHP/Faker/compare/v1.19.0..v1.20.0)
- Fixed typo in French phone number (#452)
diff --git a/vendor/fakerphp/faker/README.md b/vendor/fakerphp/faker/README.md
index 018c70bb7..c3c199d5c 100644
--- a/vendor/fakerphp/faker/README.md
+++ b/vendor/fakerphp/faker/README.md
@@ -15,7 +15,7 @@ It's heavily inspired by Perl's [Data::Faker](https://metacpan.org/pod/Data::Fak
### Installation
-Faker requires PHP >= 7.1.
+Faker requires PHP >= 7.4.
```shell
composer require fakerphp/faker
@@ -57,6 +57,37 @@ for ($i = 0; $i < 3; $i++) {
// 'Orlo Bergstrom'
```
+## Automated refactoring
+
+If you already used this library with its properties, they are now deprecated and needs to be replaced by their equivalent methods.
+
+You can use the provided [Rector](https://github.com/rectorphp/rector) config file to automate the work.
+
+Run
+
+```bash
+composer require --dev rector/rector
+```
+
+to install `rector/rector`.
+
+Run
+
+```bash
+vendor/bin/rector process src/ --config vendor/fakerphp/faker/rector-migrate.php
+```
+
+to run `rector/rector`.
+
+*Note:* do not forget to replace `src/` with the path to your source directory.
+
+Another way is to use it in your `rector.php` file:
+
+```php
+$rectorConfig->import('vendor/fakerphp/faker/rector-migrate.php');
+$faker($rectorConfig);
+```
+
## License
Faker is released under the MIT License. See [`LICENSE`](LICENSE) for details.
diff --git a/vendor/fakerphp/faker/composer.json b/vendor/fakerphp/faker/composer.json
index 7c192ac7e..9b85ce9d4 100644
--- a/vendor/fakerphp/faker/composer.json
+++ b/vendor/fakerphp/faker/composer.json
@@ -14,7 +14,7 @@
}
],
"require": {
- "php": "^7.1 || ^8.0",
+ "php": "^7.4 || ^8.0",
"psr/container": "^1.0 || ^2.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
},
@@ -22,7 +22,8 @@
"ext-intl": "*",
"bamarni/composer-bin-plugin": "^1.4.1",
"doctrine/persistence": "^1.3 || ^2.0",
- "symfony/phpunit-bridge": "^4.4 || ^5.2"
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
},
"autoload": {
"psr-4": {
@@ -54,7 +55,7 @@
},
"extra": {
"branch-alias": {
- "dev-main": "v1.20-dev"
+ "dev-main": "v1.21-dev"
}
}
}
diff --git a/vendor/fakerphp/faker/psalm.baseline.xml b/vendor/fakerphp/faker/psalm.baseline.xml
index 7d5b26835..7c3b4e871 100644
--- a/vendor/fakerphp/faker/psalm.baseline.xml
+++ b/vendor/fakerphp/faker/psalm.baseline.xml
@@ -1,5 +1,5 @@
-
+
0
@@ -139,6 +139,12 @@
+
+ [static::class, 'randomDigit']
+
+
+ $array
+
Closure
@@ -148,6 +154,22 @@
false
+
+
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $element->ownerDocument
+ $root->ownerDocument
+
+
$imei
@@ -169,7 +191,7 @@
- $checksumArr[$checksum % 11]
+ $weights[$i]
@@ -182,11 +204,40 @@
static::split($text)
+
+
+ $multipliers[$i - 1]
+
+
+
+
+ $weights[$i]
+ $weights[$i]
+
+
+
+
+ $weights[$i]
+
+
+
+ $high[$i]
+ $low[$i]
+ $result[$i]
+ $weights[$i + 3]
+ $weights[$i]
+ $weights[$i]
+
DateTime
+
+
+ $multipliers[$i]
+
+
static::lastName()
diff --git a/vendor/fakerphp/faker/rector-migrate.php b/vendor/fakerphp/faker/rector-migrate.php
new file mode 100644
index 000000000..7d99b570b
--- /dev/null
+++ b/vendor/fakerphp/faker/rector-migrate.php
@@ -0,0 +1,161 @@
+ruleWithConfiguration(
+ Transform\Rector\Assign\PropertyFetchToMethodCallRector::class,
+ array_map(static function (string $property): Transform\ValueObject\PropertyFetchToMethodCall {
+ return new Transform\ValueObject\PropertyFetchToMethodCall(
+ Generator::class,
+ $property,
+ $property,
+ );
+ }, $properties),
+ );
+};
diff --git a/vendor/fakerphp/faker/src/Faker/Calculator/Iban.php b/vendor/fakerphp/faker/src/Faker/Calculator/Iban.php
index c8fae2423..b00b18f01 100644
--- a/vendor/fakerphp/faker/src/Faker/Calculator/Iban.php
+++ b/vendor/fakerphp/faker/src/Faker/Calculator/Iban.php
@@ -17,7 +17,13 @@ class Iban
$checkString = substr($iban, 4) . substr($iban, 0, 2) . '00';
// Replace all letters with their number equivalents
- $checkString = preg_replace_callback('/[A-Z]/', ['self', 'alphaToNumberCallback'], $checkString);
+ $checkString = preg_replace_callback(
+ '/[A-Z]/',
+ static function (array $matches): string {
+ return (string) self::alphaToNumber($matches[0]);
+ },
+ $checkString,
+ );
// Perform mod 97 and subtract from 98
$checksum = 98 - self::mod97($checkString);
@@ -25,16 +31,6 @@ class Iban
return str_pad($checksum, 2, '0', STR_PAD_LEFT);
}
- /**
- * @param string $match
- *
- * @return int
- */
- private static function alphaToNumberCallback($match)
- {
- return self::alphaToNumber($match[0]);
- }
-
/**
* Converts letter to number
*
diff --git a/vendor/fakerphp/faker/src/Faker/Calculator/Isbn.php b/vendor/fakerphp/faker/src/Faker/Calculator/Isbn.php
index 72a5c4ed9..df2f59d72 100644
--- a/vendor/fakerphp/faker/src/Faker/Calculator/Isbn.php
+++ b/vendor/fakerphp/faker/src/Faker/Calculator/Isbn.php
@@ -34,9 +34,9 @@ class Isbn
$digits = str_split($input);
array_walk(
$digits,
- static function (&$digit, $position) {
+ static function (&$digit, $position): void {
$digit = (10 - $position) * $digit;
- }
+ },
);
$result = (11 - array_sum($digits) % 11) % 11;
diff --git a/vendor/fakerphp/faker/src/Faker/Container/Container.php b/vendor/fakerphp/faker/src/Faker/Container/Container.php
index ddc5a27f6..2dd2d974d 100644
--- a/vendor/fakerphp/faker/src/Faker/Container/Container.php
+++ b/vendor/fakerphp/faker/src/Faker/Container/Container.php
@@ -46,7 +46,7 @@ final class Container implements ContainerInterface
if (!is_string($id)) {
throw new \InvalidArgumentException(sprintf(
'First argument of %s::get() must be string',
- self::class
+ self::class,
));
}
@@ -57,7 +57,7 @@ final class Container implements ContainerInterface
if (!$this->has($id)) {
throw new NotInContainerException(sprintf(
'There is not service with id "%s" in the container.',
- $id
+ $id,
));
}
@@ -69,7 +69,7 @@ final class Container implements ContainerInterface
throw new \RuntimeException(sprintf(
'Service resolved for identifier "%s" does not implement the %s" interface.',
$id,
- Extension::class
+ Extension::class,
));
}
@@ -90,7 +90,7 @@ final class Container implements ContainerInterface
throw new ContainerException(
sprintf('Error while invoking callable for "%s"', $id),
0,
- $e
+ $e,
);
}
} elseif (is_object($definition)) {
@@ -106,12 +106,12 @@ final class Container implements ContainerInterface
throw new ContainerException(sprintf(
'Could not instantiate class "%s". Class was not found.',
- $id
+ $id,
));
} else {
throw new ContainerException(sprintf(
'Invalid type for definition with id "%s"',
- $id
+ $id,
));
}
}
@@ -128,7 +128,7 @@ final class Container implements ContainerInterface
if (!is_string($id)) {
throw new \InvalidArgumentException(sprintf(
'First argument of %s::get() must be string',
- self::class
+ self::class,
));
}
diff --git a/vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php b/vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php
index 008bc5d6c..3fb335fff 100644
--- a/vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php
+++ b/vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php
@@ -34,7 +34,7 @@ final class ContainerBuilder
if (!is_string($value) && !is_callable($value) && !is_object($value)) {
throw new \InvalidArgumentException(sprintf(
'First argument to "%s::add()" must be a string, callable or object.',
- self::class
+ self::class,
));
}
@@ -46,7 +46,7 @@ final class ContainerBuilder
} else {
throw new \InvalidArgumentException(sprintf(
'Second argument to "%s::add()" is required not passing a string or object as first argument',
- self::class
+ self::class,
));
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Core/Blood.php b/vendor/fakerphp/faker/src/Faker/Core/Blood.php
index 48a67ff62..50a5806c6 100644
--- a/vendor/fakerphp/faker/src/Faker/Core/Blood.php
+++ b/vendor/fakerphp/faker/src/Faker/Core/Blood.php
@@ -36,7 +36,7 @@ final class Blood implements Extension\BloodExtension
return sprintf(
'%s%s',
$this->bloodType(),
- $this->bloodRh()
+ $this->bloodRh(),
);
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Core/Color.php b/vendor/fakerphp/faker/src/Faker/Core/Color.php
index d4d5d2680..6e4e350e6 100644
--- a/vendor/fakerphp/faker/src/Faker/Core/Color.php
+++ b/vendor/fakerphp/faker/src/Faker/Core/Color.php
@@ -78,7 +78,7 @@ final class Color implements Extension\ColorExtension
$color[1],
$color[1],
$color[2],
- $color[2]
+ $color[2],
);
}
@@ -113,7 +113,7 @@ final class Color implements Extension\ColorExtension
{
return sprintf(
'rgb(%s)',
- $this->rgbColor()
+ $this->rgbColor(),
);
}
@@ -127,7 +127,7 @@ final class Color implements Extension\ColorExtension
return sprintf(
'rgba(%s,%s)',
$this->rgbColor(),
- $number->randomFloat(1, 0, 1)
+ $number->randomFloat(1, 0, 1),
);
}
@@ -158,7 +158,7 @@ final class Color implements Extension\ColorExtension
'%s,%s,%s',
$number->numberBetween(0, 360),
$number->numberBetween(0, 100),
- $number->numberBetween(0, 100)
+ $number->numberBetween(0, 100),
);
}
diff --git a/vendor/fakerphp/faker/src/Faker/Core/DateTime.php b/vendor/fakerphp/faker/src/Faker/Core/DateTime.php
index 1487cfdb1..f3d787765 100644
--- a/vendor/fakerphp/faker/src/Faker/Core/DateTime.php
+++ b/vendor/fakerphp/faker/src/Faker/Core/DateTime.php
@@ -89,7 +89,7 @@ final class DateTime implements DateTimeExtension, GeneratorAwareExtension
{
return $this->setTimezone(
$this->getTimestampDateTime($this->unixTime($until)),
- $timezone
+ $timezone,
);
}
@@ -99,7 +99,7 @@ final class DateTime implements DateTimeExtension, GeneratorAwareExtension
return $this->setTimezone(
$this->getTimestampDateTime($this->generator->numberBetween($min, $this->getTimestamp($until))),
- $timezone
+ $timezone,
);
}
@@ -116,7 +116,7 @@ final class DateTime implements DateTimeExtension, GeneratorAwareExtension
return $this->setTimezone(
$this->getTimestampDateTime($timestamp),
- $timezone
+ $timezone,
);
}
diff --git a/vendor/fakerphp/faker/src/Faker/Core/Uuid.php b/vendor/fakerphp/faker/src/Faker/Core/Uuid.php
index 7311e287f..5e3b633a2 100644
--- a/vendor/fakerphp/faker/src/Faker/Core/Uuid.php
+++ b/vendor/fakerphp/faker/src/Faker/Core/Uuid.php
@@ -50,7 +50,7 @@ final class Uuid implements UuidExtension
$byte[12],
$byte[13],
$byte[14],
- $byte[15]
+ $byte[15],
);
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Core/Version.php b/vendor/fakerphp/faker/src/Faker/Core/Version.php
index 66dcdfe83..ce484e6ad 100644
--- a/vendor/fakerphp/faker/src/Faker/Core/Version.php
+++ b/vendor/fakerphp/faker/src/Faker/Core/Version.php
@@ -26,7 +26,7 @@ final class Version implements VersionExtension
mt_rand(0, 99),
mt_rand(0, 99),
$preRelease && mt_rand(0, 1) ? '-' . $this->semverPreReleaseIdentifier() : '',
- $build && mt_rand(0, 1) ? '+' . $this->semverBuildIdentifier() : ''
+ $build && mt_rand(0, 1) ? '+' . $this->semverBuildIdentifier() : '',
);
}
diff --git a/vendor/fakerphp/faker/src/Faker/Extension/Helper.php b/vendor/fakerphp/faker/src/Faker/Extension/Helper.php
index 2820474cd..27a66143f 100644
--- a/vendor/fakerphp/faker/src/Faker/Extension/Helper.php
+++ b/vendor/fakerphp/faker/src/Faker/Extension/Helper.php
@@ -57,11 +57,9 @@ final class Helper
}
}
- $string = self::replaceWildcard($string, '%', static function () {
+ return self::replaceWildcard($string, '%', static function () {
return mt_rand(1, 9);
});
-
- return $string;
}
/**
diff --git a/vendor/fakerphp/faker/src/Faker/Generator.php b/vendor/fakerphp/faker/src/Faker/Generator.php
index 758399a3e..ec77c0874 100644
--- a/vendor/fakerphp/faker/src/Faker/Generator.php
+++ b/vendor/fakerphp/faker/src/Faker/Generator.php
@@ -584,7 +584,7 @@ class Generator
if (!$this->container->has($id)) {
throw new Extension\ExtensionNotFound(sprintf(
'No Faker extension with id "%s" was loaded.',
- $id
+ $id,
));
}
@@ -893,7 +893,7 @@ class Generator
return $this->ext(Extension\NumberExtension::class)->randomFloat(
$nbMaxDecimals !== null ? (int) $nbMaxDecimals : null,
(float) $min,
- $max !== null ? (float) $max : null
+ $max !== null ? (float) $max : null,
);
}
@@ -911,7 +911,7 @@ class Generator
{
return $this->ext(Extension\NumberExtension::class)->randomNumber(
$nbDigits !== null ? (int) $nbDigits : null,
- (bool) $strict
+ (bool) $strict,
);
}
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php b/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php
index 79d3796b8..479239995 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php
@@ -193,7 +193,7 @@ class EntityPopulator
return $obj;
}
- private function fillColumns($obj, $insertedEntities)
+ private function fillColumns($obj, $insertedEntities): void
{
foreach ($this->columnFormatters as $field => $format) {
if (null !== $format) {
@@ -205,7 +205,7 @@ class EntityPopulator
'Failed to generate a value for %s::%s: %s',
get_class($obj),
$field,
- $ex->getMessage()
+ $ex->getMessage(),
));
}
// Try a standard setter if it's available, otherwise fall back on reflection
@@ -220,7 +220,7 @@ class EntityPopulator
}
}
- private function callMethods($obj, $insertedEntities)
+ private function callMethods($obj, $insertedEntities): void
{
foreach ($this->getModifiers() as $modifier) {
$modifier($obj, $insertedEntities);
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php b/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php
index 893d85662..1bce6ab47 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php
@@ -111,7 +111,7 @@ class Populator
$insertedEntities[$class][] = $this->entities[$class]->execute(
$entityManager,
$insertedEntities,
- $generateId
+ $generateId,
);
if (count($insertedEntities) % $this->batchSize === 0) {
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php b/vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php
index 2d05230b5..3d8a9a11e 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php
@@ -69,9 +69,9 @@ class ColumnTypeGuesser
case \PropelColumnTypes::FLOAT:
case \PropelColumnTypes::DOUBLE:
case \PropelColumnTypes::REAL:
- return static function () use ($generator) {
- return $generator->randomFloat();
- };
+ return static function () use ($generator) {
+ return $generator->randomFloat();
+ };
case \PropelColumnTypes::CHAR:
case \PropelColumnTypes::VARCHAR:
@@ -102,7 +102,7 @@ class ColumnTypeGuesser
case \PropelColumnTypes::OBJECT:
case \PropelColumnTypes::PHP_ARRAY:
default:
- // no smart way to guess what the user expects here
+ // no smart way to guess what the user expects here
return null;
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php b/vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php
index bee659d52..f5af75c96 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php
@@ -157,7 +157,7 @@ class EntityPopulator
foreach ($tableMap->getBehaviors() as $name => $params) {
switch ($name) {
case 'nested_set':
- $modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator) {
+ $modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator): void {
if (isset($inserted[$class])) {
$queryClass = $class . 'Query';
$parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class]));
@@ -170,7 +170,7 @@ class EntityPopulator
break;
case 'sortable':
- $modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator) {
+ $modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator): void {
$obj->insertAtRank($generator->numberBetween(1, count($inserted[$class] ?? []) + 1));
};
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php b/vendor/fakerphp/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php
index 66e109c79..4c08e0ad3 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php
@@ -105,7 +105,7 @@ class ColumnTypeGuesser
case PropelTypes::OBJECT:
case PropelTypes::PHP_ARRAY:
default:
- // no smart way to guess what the user expects here
+ // no smart way to guess what the user expects here
return null;
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Propel2/EntityPopulator.php b/vendor/fakerphp/faker/src/Faker/ORM/Propel2/EntityPopulator.php
index 199f4563f..44804e37c 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Propel2/EntityPopulator.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Propel2/EntityPopulator.php
@@ -160,7 +160,7 @@ class EntityPopulator
foreach ($tableMap->getBehaviors() as $name => $params) {
switch ($name) {
case 'nested_set':
- $modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator) {
+ $modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator): void {
if (isset($inserted[$class])) {
$queryClass = $class . 'Query';
$parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class]));
@@ -173,7 +173,7 @@ class EntityPopulator
break;
case 'sortable':
- $modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator) {
+ $modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator): void {
$obj->insertAtRank($generator->numberBetween(1, count($inserted[$class] ?? []) + 1));
};
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Spot/EntityPopulator.php b/vendor/fakerphp/faker/src/Faker/ORM/Spot/EntityPopulator.php
index c0afbb7ca..b67ae2530 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Spot/EntityPopulator.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Spot/EntityPopulator.php
@@ -180,7 +180,7 @@ class EntityPopulator
return $obj;
}
- private function fillColumns($obj, $insertedEntities)
+ private function fillColumns($obj, $insertedEntities): void
{
foreach ($this->columnFormatters as $field => $format) {
if (null !== $format) {
@@ -190,7 +190,7 @@ class EntityPopulator
}
}
- private function callMethods($obj, $insertedEntities)
+ private function callMethods($obj, $insertedEntities): void
{
foreach ($this->getModifiers() as $modifier) {
$modifier($obj, $insertedEntities);
diff --git a/vendor/fakerphp/faker/src/Faker/ORM/Spot/Populator.php b/vendor/fakerphp/faker/src/Faker/ORM/Spot/Populator.php
index 67202bb3b..b321f5c5a 100644
--- a/vendor/fakerphp/faker/src/Faker/ORM/Spot/Populator.php
+++ b/vendor/fakerphp/faker/src/Faker/ORM/Spot/Populator.php
@@ -79,7 +79,7 @@ class Populator
foreach ($this->quantities as $entityName => $number) {
for ($i = 0; $i < $number; ++$i) {
$insertedEntities[$entityName][] = $this->entities[$entityName]->execute(
- $insertedEntities
+ $insertedEntities,
);
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/Base.php b/vendor/fakerphp/faker/src/Faker/Provider/Base.php
index 4ff4492a4..e3713ce0e 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/Base.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/Base.php
@@ -363,7 +363,7 @@ class Base
return implode('', static::shuffleArray($array));
}
- private static function replaceWildcard($string, $wildcard = '#', $callback = 'static::randomDigit')
+ private static function replaceWildcard($string, $wildcard, $callback)
{
if (($pos = strpos($string, $wildcard)) === false) {
return $string;
@@ -415,7 +415,7 @@ class Base
$string[$toReplace[$i]] = $numbers[$i];
}
}
- $string = self::replaceWildcard($string, '%', 'static::randomDigitNotNull');
+ $string = self::replaceWildcard($string, '%', [static::class, 'randomDigitNotNull']);
return $string;
}
@@ -429,7 +429,7 @@ class Base
*/
public static function lexify($string = '????')
{
- return self::replaceWildcard($string, '?', 'static::randomLetter');
+ return self::replaceWildcard($string, '?', [static::class, 'randomLetter']);
}
/**
@@ -460,7 +460,7 @@ class Base
*/
public static function asciify($string = '****')
{
- return preg_replace_callback('/\*/u', 'static::randomAscii', $string);
+ return preg_replace_callback('/\*/u', [static::class, 'randomAscii'], $string);
}
/**
@@ -532,8 +532,8 @@ class Base
return str_replace('.', '\.', $randomElement);
}, $regex);
// replace \d with number and \w with letter and . with ascii
- $regex = preg_replace_callback('/\\\w/', 'static::randomLetter', $regex);
- $regex = preg_replace_callback('/\\\d/', 'static::randomDigit', $regex);
+ $regex = preg_replace_callback('/\\\w/', [static::class, 'randomLetter'], $regex);
+ $regex = preg_replace_callback('/\\\d/', [static::class, 'randomDigit'], $regex);
//replace . with ascii except backslash
$regex = preg_replace_callback('/(?ownerDocument->createElement(static::P_TAG);
$node->textContent = $this->generator->sentence(self::numberBetween(1, $maxLength));
$element->appendChild($node);
}
- private function addRandomText(\DOMElement $element, $maxLength = 10)
+ private function addRandomText(\DOMElement $element, $maxLength = 10): void
{
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
$element->appendChild($text);
}
- private function addRandomA(\DOMElement $element, $maxLength = 10)
+ private function addRandomA(\DOMElement $element, $maxLength = 10): void
{
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
$node = $element->ownerDocument->createElement(static::A_TAG);
@@ -185,7 +185,7 @@ class HtmlLorem extends Base
$element->appendChild($node);
}
- private function addRandomTitle(\DOMElement $element, $maxLength = 10)
+ private function addRandomTitle(\DOMElement $element, $maxLength = 10): void
{
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
$node = $element->ownerDocument->createElement(static::TITLE_TAG);
@@ -193,7 +193,7 @@ class HtmlLorem extends Base
$element->appendChild($node);
}
- private function addRandomH(\DOMElement $element, $maxLength = 10)
+ private function addRandomH(\DOMElement $element, $maxLength = 10): void
{
$h = static::H_TAG . (string) self::numberBetween(1, 3);
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
@@ -202,7 +202,7 @@ class HtmlLorem extends Base
$element->appendChild($node);
}
- private function addRandomB(\DOMElement $element, $maxLength = 10)
+ private function addRandomB(\DOMElement $element, $maxLength = 10): void
{
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
$node = $element->ownerDocument->createElement(static::B_TAG);
@@ -210,7 +210,7 @@ class HtmlLorem extends Base
$element->appendChild($node);
}
- private function addRandomI(\DOMElement $element, $maxLength = 10)
+ private function addRandomI(\DOMElement $element, $maxLength = 10): void
{
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
$node = $element->ownerDocument->createElement(static::I_TAG);
@@ -218,7 +218,7 @@ class HtmlLorem extends Base
$element->appendChild($node);
}
- private function addRandomSpan(\DOMElement $element, $maxLength = 10)
+ private function addRandomSpan(\DOMElement $element, $maxLength = 10): void
{
$text = $element->ownerDocument->createTextNode($this->generator->sentence(self::numberBetween(1, $maxLength)));
$node = $element->ownerDocument->createElement(static::SPAN_TAG);
@@ -226,7 +226,7 @@ class HtmlLorem extends Base
$element->appendChild($node);
}
- private function addLoginForm(\DOMElement $element)
+ private function addLoginForm(\DOMElement $element): void
{
$textInput = $element->ownerDocument->createElement(static::INPUT_TAG);
$textInput->setAttribute('type', 'text');
@@ -258,7 +258,7 @@ class HtmlLorem extends Base
$element->appendChild($submit);
}
- private function addRandomTable(\DOMElement $element, $maxRows = 10, $maxCols = 6, $maxTitle = 4, $maxLength = 10)
+ private function addRandomTable(\DOMElement $element, $maxRows = 10, $maxCols = 6, $maxTitle = 4, $maxLength = 10): void
{
$rows = self::numberBetween(1, $maxRows);
$cols = self::numberBetween(1, $maxCols);
@@ -292,7 +292,7 @@ class HtmlLorem extends Base
$element->appendChild($table);
}
- private function addRandomUL(\DOMElement $element, $maxItems = 11, $maxLength = 4)
+ private function addRandomUL(\DOMElement $element, $maxItems = 11, $maxLength = 4): void
{
$num = self::numberBetween(1, $maxItems);
$ul = $element->ownerDocument->createElement(static::UL_TAG);
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/Image.php b/vendor/fakerphp/faker/src/Faker/Provider/Image.php
index 0c3ad68c1..53f28dfcf 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/Image.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/Image.php
@@ -55,7 +55,7 @@ class Image extends Base
trigger_deprecation(
'fakerphp/faker',
'1.20',
- 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead'
+ 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead',
);
// Validate image format
@@ -65,7 +65,7 @@ class Image extends Base
throw new \InvalidArgumentException(sprintf(
'Invalid image format "%s". Allowable formats are: %s',
$format,
- implode(', ', $imageFormats)
+ implode(', ', $imageFormats),
));
}
@@ -92,7 +92,7 @@ class Image extends Base
self::BASE_URL,
$size,
$backgroundColor,
- count($imageParts) > 0 ? '?text=' . urlencode(implode(' ', $imageParts)) : ''
+ count($imageParts) > 0 ? '?text=' . urlencode(implode(' ', $imageParts)) : '',
);
}
@@ -119,7 +119,7 @@ class Image extends Base
trigger_deprecation(
'fakerphp/faker',
'1.20',
- 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead'
+ 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead',
);
$dir = null === $dir ? sys_get_temp_dir() : $dir; // GNU/Linux / OS X / Windows compatible
@@ -172,7 +172,7 @@ class Image extends Base
trigger_deprecation(
'fakerphp/faker',
'1.20',
- 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead'
+ 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead',
);
return array_keys(static::getFormatConstants());
@@ -183,7 +183,7 @@ class Image extends Base
trigger_deprecation(
'fakerphp/faker',
'1.20',
- 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead'
+ 'Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead',
);
return [
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/Uuid.php b/vendor/fakerphp/faker/src/Faker/Provider/Uuid.php
index 1cd15cab3..bcfcb05d9 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/Uuid.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/Uuid.php
@@ -53,7 +53,7 @@ class Uuid extends Base
$byte[12],
$byte[13],
$byte[14],
- $byte[15]
+ $byte[15],
);
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Person.php b/vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Person.php
index c7bd16ec9..505c8640c 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Person.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Person.php
@@ -93,7 +93,7 @@ class Person extends \Faker\Provider\Person
public static function idNumber()
{
$partialValue = static::numerify(
- static::randomElement([1, 2]) . str_repeat('#', 8)
+ static::randomElement([1, 2]) . str_repeat('#', 8),
);
return Luhn::generateLuhnNumber($partialValue);
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Payment.php b/vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Payment.php
index 9a772c8ac..d7ed58b89 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Payment.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Payment.php
@@ -40,7 +40,7 @@ class Payment extends \Faker\Provider\Payment
'%s%d%d',
$prefix,
self::randomNumber(5, true), // workaround for mt_getrandmax() limitation
- self::randomNumber(self::randomElement([4, 5]), true)
+ self::randomNumber(self::randomElement([4, 5]), true),
);
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/de_DE/PhoneNumber.php b/vendor/fakerphp/faker/src/Faker/Provider/de_DE/PhoneNumber.php
index 637f66833..610ae8e2a 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/de_DE/PhoneNumber.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/de_DE/PhoneNumber.php
@@ -4,21 +4,124 @@ namespace Faker\Provider\de_DE;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
+ /**
+ * @var array
+ */
+ protected static $areaCodeRegexes = [
+ 2 => '(0[0-389]|0[4-6][1-68]|1[124]|1[0-9][0-9]|2[18]|2[0-9][1-9]|3[14]|3[0-35-9][0-9]|4[1]|4[02-8][0-9]|5[1]|5[02-9][0-9]|6[1]|6[02-9][0-9]|7[1]|7[2-7][0-9]|8[1]|8[02-7][0-9]|9[1]|9[02-9][0-9])',
+ 3 => '(0|3[15]|3[02-46-9][1-9]|3[02-46-9][02-9][0-9]|4[015]|4[2-4679][1-8]|4[2-4679][02-9][0-9]|5[15]|5[02-46-9][1-9]|5[02-46-9][02-9][0-9]|6[15]|6[02-46-9][1-9]|6[02-46-9][02-9][0-9]|7[15]|7[2-467][1-7]|7[2-467][02-689][0-9]|8[15]|8[2-46-8][013-9]|8[2-46-8][02-9][0-9]|9[15]|9[02-46-9][1-9]|9[02-46-9][02-9][0-9])',
+ 4 => '(0|1[02-9][0-9]|2[1]|2[02-9][0-9]|3[1]|3[02-9][0-9]|4[1]|4[0-9][0-9]|5[1]|5[02-6][0-9]|6[1]|6[02-8][0-9]|7[1]|7[02-79][0-9]|8[1]|8[02-9][0-9]|9[1]|9[02-7][0-9])',
+ 5 => '(0[2-8][0-9]|1[1]|1[02-9][0-9]|2[1]|2[02-9][1-9]|3[1]|3[02-8][0-9]|4[1]|4[02-9][1-9]|5[1]|5[02-9][0-9]|6[1]|6[02-9][0-9]|7[1]|7[02-7][1-9]|8[1]|8[02-8][0-9]|9[1]|9[0-7][1-9])',
+ 6 => '(0[02-9][0-9]|1[1]|1[02-9][0-9]|2[1]|2[02-9][0-9]|3[1]|3[02-9][0-9]|4[1]|4[0-8][0-9]|5[1]|5[02-9][0-9]|6[1]|6[2-9][0-9]|7[1]|7[02-8][1-9]|8[1]|8[02-9][1-9]|9)',
+ 7 => '(0[2-8][1-6]|1[1]|1[2-9][0-9]|2[1]|2[0-7][0-9]|3[1]|3[02-9][0-9]|4[1]|4[0-8][0-9]|5[1]|5[02-8][0-9]|6[1]|6[02-8][0-9]|7[1]|7[02-7][0-9]|8[1]|8[02-5][1-9]|9[1]|9[03-7][0-9])',
+ 8 => '(0[2-9][0-9]|1[1]|1[02-79][0-9]|2[1]|2[02-9][0-9]|3[1]|3[02-9][0-9]|4[1]|4[02-6][0-9]|5[1]|5[02-9][0-9]|6[1]|6[2-8][0-9]|7[1]|7[02-8][1-9]|8[1]|8[02-6][0-9]|9)',
+ 9 => '(0[6]|0[07-9][0-9]|1[1]|1[02-9][0-9]|2[1]|2[02-9][0-9]|3[1]|3[02-9][0-9]|4[1]|4[02-9][0-9]|5[1]|5[02-7][0-9]|6[1]|6[02-8][1-9]|7[1]|7[02-467][0-9]|8[1]|8[02-7][0-9]|9[1]|9[02-7][0-9])',
+ ];
+
+ /**
+ * @see https://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers#Germany
+ * @see https://www.itu.int/oth/T0202000051/en
+ * @see https://en.wikipedia.org/wiki/Telephone_numbers_in_Germany
+ */
protected static $formats = [
- '+49(0)##########',
- '+49(0)#### ######',
- '+49 (0) #### ######',
- '+49(0) #########',
- '+49(0)#### #####',
- '0##########',
- '0#########',
- '0#### ######',
- '0#### #####',
- '(0####) ######',
- '(0####) #####',
+ // International format
+ '+49 {{areaCode}} #######',
+ '+49 {{areaCode}} ### ####',
+ '+49 (0{{areaCode}}) #######',
+ '+49 (0{{areaCode}}) ### ####',
+ '+49{{areaCode}}#######',
+ '+49{{areaCode}}### ####',
+
+ // Standard formats
+ '0{{areaCode}} ### ####',
+ '0{{areaCode}} #######',
+ '(0{{areaCode}}) ### ####',
+ '(0{{areaCode}}) #######',
];
protected static $e164Formats = [
- '+49##########',
+ '+49{{areaCode}}#######',
];
+
+ /**
+ * @see https://en.wikipedia.org/wiki/Toll-free_telephone_number
+ */
+ protected static $tollFreeAreaCodes = [
+ 800,
+ ];
+
+ protected static $tollFreeFormats = [
+ // Standard formats
+ '0{{tollFreeAreaCode}} ### ####',
+ '(0{{tollFreeAreaCode}}) ### ####',
+ '+49{{tollFreeAreaCode}} ### ####',
+ ];
+
+ public function tollFreeAreaCode()
+ {
+ return self::randomElement(static::$tollFreeAreaCodes);
+ }
+
+ public function tollFreePhoneNumber()
+ {
+ $format = self::randomElement(static::$tollFreeFormats);
+
+ return self::numerify($this->generator->parse($format));
+ }
+
+ protected static $mobileCodes = [
+ 1511, 1512, 1514, 1515, 1516, 1517,
+ 1520, 1521, 1522, 1523, 1525, 1526, 1529,
+ 1570, 1573, 1575, 1577, 1578, 1579,
+ 1590,
+ ];
+
+ protected static $mobileFormats = [
+ '+49{{mobileCode}}#######',
+ '+49 {{mobileCode}} ### ####',
+ '0{{mobileCode}}#######',
+ '0{{mobileCode}} ### ####',
+ '0 {{mobileCode}} ### ####',
+ ];
+
+ /**
+ * @see https://en.wikipedia.org/wiki/List_of_dialling_codes_in_Germany
+ *
+ * @return string
+ */
+ public static function areaCode()
+ {
+ $firstDigit = self::numberBetween(2, 9);
+
+ return $firstDigit . self::regexify(self::$areaCodeRegexes[$firstDigit]);
+ }
+
+ /**
+ * Generate a code for a mobile number.
+ *
+ * @internal Used to generate mobile numbers.
+ *
+ * @return string
+ */
+ public static function mobileCode()
+ {
+ return static::randomElement(static::$mobileCodes);
+ }
+
+ /**
+ * Generate a mobile number.
+ *
+ * @example A mobile number: '015111234567'
+ * @example A mobile number with spaces: '01511 123 4567'
+ * @example A mobile number with international code prefix: '+4915111234567'
+ * @example A mobile number with international code prefix and spaces: '+49 1511 123 4567'
+ *
+ * @return string
+ */
+ public function mobileNumber()
+ {
+ return ltrim(static::numerify($this->generator->parse(
+ static::randomElement(static::$mobileFormats),
+ )));
+ }
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/el_GR/PhoneNumber.php b/vendor/fakerphp/faker/src/Faker/Provider/el_GR/PhoneNumber.php
index 6fe5000ef..530324870 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/el_GR/PhoneNumber.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/el_GR/PhoneNumber.php
@@ -158,7 +158,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
public static function areaCode()
{
return static::numerify(
- str_pad(static::randomElement(static::$areaCodes), 4, '#')
+ str_pad(static::randomElement(static::$areaCodes), 4, '#'),
);
}
@@ -182,7 +182,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
public function fixedLineNumber()
{
return ltrim(static::numerify($this->generator->parse(
- static::randomElement(static::$fixedLineFormats)
+ static::randomElement(static::$fixedLineFormats),
)));
}
@@ -211,7 +211,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
public function mobileNumber()
{
return ltrim(static::numerify($this->generator->parse(
- static::randomElement(static::$mobileFormats)
+ static::randomElement(static::$mobileFormats),
)));
}
@@ -224,7 +224,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
strtr(static::randomElement(static::$mobileFormats), [
'{{internationalCodePrefix}}' => static::internationalCodePrefix(),
'{{mobileCode}}' => static::mobileCode(),
- ])
+ ]),
);
}
@@ -241,7 +241,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
public function personalNumber()
{
return ltrim(static::numerify($this->generator->parse(
- static::randomElement(static::$personalFormats)
+ static::randomElement(static::$personalFormats),
)));
}
@@ -260,7 +260,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
return ltrim(static::numerify(
strtr(static::randomElement(static::$tollFreeFormats), [
'{{internationalCodePrefix}}' => static::internationalCodePrefix(),
- ])
+ ]),
));
}
@@ -289,7 +289,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
public function sharedCostNumber()
{
return ltrim(static::numerify($this->generator->parse(
- static::randomElement(static::$sharedCostFormats)
+ static::randomElement(static::$sharedCostFormats),
)));
}
@@ -318,7 +318,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
public function premiumRateNumber()
{
return ltrim(static::numerify($this->generator->parse(
- static::randomElement(static::$premiumRateFormats)
+ static::randomElement(static::$premiumRateFormats),
)));
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/en_CA/Address.php b/vendor/fakerphp/faker/src/Faker/Provider/en_CA/Address.php
index 5d9bd58d8..4e9aa5079 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/en_CA/Address.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/en_CA/Address.php
@@ -64,8 +64,8 @@ class Address extends \Faker\Provider\en_US\Address
{
$string = static::randomElement(static::$postcode);
- $string = preg_replace_callback('/\#/u', 'static::randomDigit', $string);
- $string = preg_replace_callback('/\?/u', 'static::randomPostcodeLetter', $string);
+ $string = preg_replace_callback('/\#/u', [static::class, 'randomDigit'], $string);
+ $string = preg_replace_callback('/\?/u', [static::class, 'randomPostcodeLetter'], $string);
return static::toUpper($string);
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/en_GB/Company.php b/vendor/fakerphp/faker/src/Faker/Provider/en_GB/Company.php
index e00b34c17..17fe07da0 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/en_GB/Company.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/en_GB/Company.php
@@ -21,7 +21,6 @@ class Company extends \Faker\Provider\Company
public static function vat(string $type = null): string
{
switch ($type) {
-
case static::VAT_TYPE_BRANCH:
return static::generateBranchTraderVatNumber();
@@ -33,7 +32,6 @@ class Company extends \Faker\Provider\Company
default:
return static::generateStandardVatNumber();
-
}
}
@@ -55,7 +53,7 @@ class Company extends \Faker\Provider\Company
static::VAT_PREFIX,
$firstBlock,
$secondBlock,
- static::calculateModulus97($firstBlock . $secondBlock)
+ static::calculateModulus97($firstBlock . $secondBlock),
);
}
@@ -68,7 +66,7 @@ class Company extends \Faker\Provider\Company
return sprintf(
'%sHA%d',
static::VAT_PREFIX,
- static::numberBetween(500, 999)
+ static::numberBetween(500, 999),
);
}
@@ -81,7 +79,7 @@ class Company extends \Faker\Provider\Company
return sprintf(
'%s %d',
static::generateStandardVatNumber(),
- static::randomNumber(3, true)
+ static::randomNumber(3, true),
);
}
@@ -94,7 +92,7 @@ class Company extends \Faker\Provider\Company
return sprintf(
'%sGD%s',
static::VAT_PREFIX,
- str_pad((string) static::numberBetween(0, 499), 3, '0', STR_PAD_LEFT)
+ str_pad((string) static::numberBetween(0, 499), 3, '0', STR_PAD_LEFT),
);
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/en_ZA/Company.php b/vendor/fakerphp/faker/src/Faker/Provider/en_ZA/Company.php
index 86a54321a..6480c696f 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/en_ZA/Company.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/en_ZA/Company.php
@@ -20,7 +20,7 @@ class Company extends \Faker\Provider\Company
'%s/%s/%s',
\Faker\Provider\DateTime::dateTimeBetween('-50 years', 'now')->format('Y'),
static::randomNumber(6, true),
- static::randomElement(static::$legalEntities)
+ static::randomElement(static::$legalEntities),
);
}
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Address.php b/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Address.php
index 5ca40ad9d..106f648cc 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Address.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Address.php
@@ -43,13 +43,13 @@ class Address extends \Faker\Provider\Address
'Territoire britannique de l\'océan Indien', 'Territoires français du sud', 'Thailande', 'Timor', 'Togo', 'Tokelau', 'Tonga', 'Trinité et Tobago', 'Tunisie', 'Turkménistan', 'Turks et Caïques (Îles)', 'Turquie', 'Tuvalu', 'Ukraine', 'Uruguay', 'Vanuatu', 'Vatican (Etat du)', 'Venezuela', 'Vierges (Îles)', 'Vierges britanniques (Îles)', 'Vietnam', 'Wallis et Futuna (Îles)', 'Yemen', 'Yougoslavie', 'Zambie', 'Zaïre', 'Zimbabwe',
];
+ /**
+ * @see https://en.wikipedia.org/wiki/Regions_of_France
+ */
private static $regions = [
- 'Alsace', 'Aquitaine', 'Auvergne', 'Bourgogne', 'Bretagne', 'Centre', 'Champagne-Ardenne',
- 'Corse', 'Franche-Comté', 'Île-de-France', 'Languedoc-Roussillon', 'Limousin',
- 'Lorraine', 'Midi-Pyrénées', 'Nord-Pas-de-Calais', 'Basse-Normandie', 'Haute-Normandie',
- 'Pays-de-Loire', 'Picardie', 'Poitou-Charentes', "Provence-Alpes-Côte d'Azur", 'Rhone-Alpes',
- 'Guadeloupe', 'Martinique', 'Guyane', 'Réunion', 'Saint-Pierre-et-Miquelon', 'Mayotte',
- 'Saint-Barthélémy', 'Saint-Martin', 'Wallis-et-Futuna', 'Polynésie française', 'Nouvelle-Calédonie',
+ 'Auvergne-Rhône-Alpes', 'Bourgogne-Franche-Comté', 'Bretagne', 'Centre-Val de Loire', 'Corse', 'Grand Est', 'Hauts-de-France',
+ 'Île-de-France', 'Normandie', 'Nouvelle-Aquitaine', 'Occitanie', 'Pays de la Loire', "Provence-Alpes-Côte d'Azur",
+ 'Guadeloupe', 'Martinique', 'Guyane', 'La Réunion', 'Mayotte',
];
private static $departments = [
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Company.php b/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Company.php
index fcc142dad..0a659aa7c 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Company.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/fr_FR/Company.php
@@ -173,6 +173,7 @@ class Company extends \Faker\Provider\Company
/**
* @see http://www.pole-emploi.fr/candidat/le-code-rome-et-les-fiches-metiers-@/article.jspz?id=60702
+ *
* @note Randomly took 300 from this list
*/
protected static $jobTitleFormat = [
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/hu_HU/Person.php b/vendor/fakerphp/faker/src/Faker/Provider/hu_HU/Person.php
index 0b55573f1..76d84be07 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/hu_HU/Person.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/hu_HU/Person.php
@@ -21,7 +21,7 @@ class Person extends \Faker\Provider\Person
'{{title}} {{lastName}} {{firstNameFemale}}',
'{{lastName}} {{firstNameFemale}} {{suffix}}',
'{{title}} {{lastName}} {{firstNameFemale}} {{suffix}}',
- '{{lastNameFemaleMarried}} {{$lastName}} {{firstNameFemale}}',
+ '{{lastNameFemaleMarried}} {{lastName}} {{firstNameFemale}}',
'{{title}} {{lastNameFemaleMarried}} {{firstNameFemale}}',
'{{lastName}} {{firstNameMaleNe}}',
'{{title}} {{lastName}} {{firstNameMaleNe}}',
@@ -93,4 +93,9 @@ class Person extends \Faker\Provider\Person
{
return static::randomElement(static::$suffix);
}
+
+ public static function lastNameFemaleMarried()
+ {
+ return static::randomElement(static::$lastNameFemaleMarried);
+ }
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Address.php b/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Address.php
index 1fb2270a8..28dd845c5 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Address.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Address.php
@@ -6,6 +6,7 @@ class Address extends \Faker\Provider\Address
{
/**
* @see http://bandung.go.id/images/download/daftarruasjalan.htm
+ * @see https://id.wikipedia.org/wiki/Kategori:Jalan_di_Jakarta
*/
protected static $street = [
'Abang', 'Abdul', 'Abdul Muis', 'Abdul Rahmat', 'Abdul. Muis', 'Abdullah',
@@ -17,7 +18,7 @@ class Address extends \Faker\Provider\Address
'Bagonwoto ', 'Bah Jaya', 'Baha', 'Bahagia', 'Bahagia ',
'Baiduri', 'Baik', 'Baing', 'Baja', 'Baja Raya',
'Bak Air', 'Bak Mandi', 'Bakaru', 'Bakau', 'Bakau Griya Utama',
- 'Bakhita', 'Bakin', 'Bakit ', 'Bakti', 'Baladewa',
+ 'Bakhita', 'Bakin', 'Bakit ', 'Bakti', 'Baladewa', 'Balikpapan',
'Bambon', 'Bambu', 'Banal', 'Banceng Pondok', 'Banda',
'Bank Dagang Negara', 'Bappenas', 'Bara', 'Bara Tambar', 'Baranang',
'Baranang Siang', 'Baranang Siang Indah', 'Baranangsiang', 'Barasak', 'Barat',
@@ -32,7 +33,7 @@ class Address extends \Faker\Provider\Address
'Flora', 'Flores', 'Gading', 'Gajah', 'Gajah Mada',
'Gambang', 'Gardujati', 'Gatot Subroto', 'Gedebage Selatan', 'Gegerkalong Hilir',
'Gotong Royong', 'Gremet', 'HOS. Cjokroaminoto (Pasirkaliki)', 'Haji', 'Halim',
- 'Hang', 'Hasanuddin', 'Honggowongso', 'Ikan', 'Imam',
+ 'Hang', 'Hasanuddin', 'Hayam Wuruk', 'Honggowongso', 'Ikan', 'Imam',
'Imam Bonjol', 'Industri', 'Ir. H. Juanda', 'Jagakarsa', 'Jakarta',
'Jaksa', 'Jambu', 'Jamika', 'Jayawijaya', 'Jend. A. Yani',
'Jend. Sudirman', 'Juanda', 'K.H. Maskur', 'K.H. Wahid Hasyim (Kopo)', 'Kali',
@@ -45,7 +46,7 @@ class Address extends \Faker\Provider\Address
'Muwardi', 'Nakula', 'Nanas', 'Nangka', 'Orang',
'Otista', 'Otto', 'PHH. Mustofa', 'Pacuan Kuda', 'Padang',
'Padma', 'Pahlawan', 'Panjaitan', 'Pasir Koja', 'Pasirkoja',
- 'Pasteur', 'Pattimura', 'Pelajar Pejuang 45', 'Perintis Kemerdekaan', 'Peta',
+ 'Pasteur', 'Pattimura', 'Pelajar Pejuang 45', 'Perintis Kemerdekaan', 'Peta', 'Pintu Besar Selatan',
'Qrisdoren', 'R.E. Martadinata', 'R.M. Said', 'Raden', 'Raden Saleh',
'Radio', 'Rajawali', 'Rajawali Barat', 'Rajawali Timur', 'Rajiman',
'Raya Setiabudhi', 'Raya Ujungberung', 'Reksoninten', 'Ronggowarsito',
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Company.php b/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Company.php
index ffbf6e355..a4a8575c6 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Company.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/id_ID/Company.php
@@ -14,7 +14,7 @@ class Company extends \Faker\Provider\Company
/**
* @see http://id.wikipedia.org/wiki/Jenis_badan_usaha
*/
- protected static $companyPrefix = ['PT', 'CV', 'UD', 'PD', 'Perum'];
+ protected static $companyPrefix = ['PT', 'Fa', 'CV', 'UD', 'PJ', 'PD', 'Perum', 'Yayasan'];
/**
* @see https://www.amesbostonhotel.com/macam-macam-profesi-pekerjaan/
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/it_IT/Text.php b/vendor/fakerphp/faker/src/Faker/Provider/it_IT/Text.php
index 08fa689c0..161273fbe 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/it_IT/Text.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/it_IT/Text.php
@@ -5,1991 +5,2075 @@ namespace Faker\Provider\it_IT;
class Text extends \Faker\Provider\Text
{
/**
- * Carlo Collodi
- * Pinocchio
- * Questo e-book è stato realizzato anche grazie al sostegno di:
+ * The Project Gutenberg EBook of Una notte bizzarra, by Anton Giulio Barrili
*
- * E-text
- * Web design, Editoria, Multimedia
- * (pubblica il tuo libro, o crea il tuo sito con E-text!)
- * http://www.e-text.it/
+ * This eBook is for the use of anyone anywhere at no cost and with
+ * almost no restrictions whatsoever. You may copy it, give it away or
+ * re-use it under the terms of the Project Gutenberg License included
+ * with this eBook or online at www.gutenberg.org
*
- * QUESTO E-BOOK:
+ * Title: Una notte bizzarra
+ * Author: Anton Giulio Barrili
+ * Release Date: August 8, 2009 [EBook #29636]
+ * Language: Italian
*
- * TITOLO: Pinocchio
- * AUTORE: Collodi, Carlo
- * TRADUTTORE:
- * CURATORE:
- * NOTE:
+ * *** START OF THIS PROJECT GUTENBERG EBOOK UNA NOTTE BIZZARRA ***
*
- * CODICE ISBN E-BOOK: 9788890359767
*
- * DIRITTI D'AUTORE: no
+ * Produced by Claudio Paganelli, Carlo Traverso and the
+ * Online Distributed Proofreading Team at http://www.pgdp.net
+ * (This file was produced from images generously made
+ * available by The Internet Archive/Canadian Libraries)
*
- * LICENZA: questo testo è distribuito con la licenza specificata al seguente indirizzo Internet: http://www.liberliber.it/libri/licenze/ (Attribution-NonCommercial-ShareAlike 4.0 International)
*
- * TRATTO DA: Le avventure di Pinocchio : storia di un burattino / di Carlo Collodi ; illustrata da Enrico Mazzanti. – 2a edizione. – Milano : Rizzoli Editore, Milano, 1949.
+ * CAPITAN DODERO
*
- * CODICE ISBN: informazione non disponibile
+ * UNA NOTTE BIZZARRA
*
- * 1a EDIZIONE ELETTRONICA DEL: 28 gennaio 1996
- * 2a EDIZIONE ELETTRONICA DEL: 17 gennaio 2002
- * 3a EDIZIONE ELETTRONICA DEL: 19 luglio 2013
+ * NOVELLE DI ANTON GIULIO BARRILI
*
- * INDICE DI AFFIDABILITA': 1
- * 0: affidabilità bassa
- * 1: affidabilità media
- * 2: affidabilità buona
- * 3: affidabilità ottima
+ * Settima edizione.
*
- * DIGITALIZZAZIONE:
- * Riccardo Scateni
+ * MILANO
*
- * REVISIONE:
- * Marco Zela
+ * FRATELLI TREVES, EDITORI 1881.
*
- * IMPAGINAZIONE:
- * Riccardo Scateni
- * Marco Zela
- * Catia Righi
+ * PROPRIETÀ LETTERARIA
*
- * PUBBLICAZIONE:
- * Marco Calvo, http://www.marcocalvo.it/
- * Informazioni sul "progetto Manuzio"
- * Il "progetto Manuzio" è una iniziativa dell'associazione culturale Liber Liber. Aperto a chiunque voglia collaborare, si pone come scopo la pubblicazione e la diffusione gratuita di opere letterarie in formato elettronico. Ulteriori informazioni sono disponibili sul sito Internet:
- * http://www.liberliber.it/
- * Aiuta anche tu il "progetto Manuzio"
- * Se questo "libro elettronico" è stato di tuo gradimento, o se condividi le finalità del "progetto Manuzio", invia una donazione a Liber Liber. Il tuo sostegno ci aiuterà a far crescere ulteriormente la nostra biblioteca. Qui le istruzioni:
- * http://www.liberliber.it/aiuta/
+ * Tip. Treves
*
- * Indice generale
- * I. Come andò che maestro Ciliegia, falegname, trovò un pezzo di legno, che piangeva e rideva come un bambino.
- * II. Maestro Ciliegia regala il pezzo di legno al suo amico Geppetto, il quale lo prende per fabbricarsi un burattino maraviglioso che sappia ballare, tirar di scherma e fare i salti mortali.
- * III Geppetto, tornato a casa, comincia subito a fabbricarsi il burattino e gli mette il nome di Pinocchio. Prime monellerie del burattino.
- * IV La storia di Pinocchio col Grillo-parlante, dove si vede come i ragazzi cattivi hanno a noia di sentirsi correggere da chi ne sa più di loro.
- * V Pinocchio ha fame, e cerca un uovo per farsi una frittata; ma sul più bello, la frittata gli vola via dalla finestra.
- * VI Pinocchio si addormenta coi piedi sul caldano, e la mattina dopo si sveglia coi piedi tutti bruciati.
- * VII Geppetto torna a casa, e dà al burattino la colazione che il pover’uomo aveva portata con sé.
- * VIII Geppetto rifà i piedi a Pinocchio e vende la propria casacca per comprargli l’Abbecedario.
- * IX Pinocchio vende l’Abbecedario per andare a vedere il teatrino dei burattini.
- * X I burattini riconoscono il loro fratello Pinocchio e gli fanno una grandissima festa; ma sul più bello, esce fuori il burattinaio Mangiafoco, e Pinocchio corre il pericolo di fare una brutta fine.
- * XI Mangiafoco starnutisce e perdona a Pinocchio, il quale poi difende dalla morte il suo amico Arlecchino.
- * XII Il burattinaio Mangiafoco regala cinque monete d’oro a Pinocchio, perché le porti al suo babbo Geppetto: e Pinocchio, invece, si lascia abbindolare dalla Volpe e dal Gatto e se ne va con loro.
- * XIII L’osteria del Gambero Rosso.
- * XIV Pinocchio, per non aver dato retta ai buoni consigli del Grillo-parlante, s’imbatte negli assassini.
- * XV Gli assassini inseguono Pinocchio; e, dopo averlo raggiunto, lo impiccano a un ramo della Quercia grande.
- * XVI La bella Bambina dai capelli turchini fa raccogliere il burattino: lo mette a letto, e chiama tre medici per sapere se sia vivo o morto.
- * XVII Pinocchio mangia lo zucchero, ma non vuol purgarsi: Però quando vede i becchini che vengono a portarlo via, allora si purga. Poi dice una bugia e per gastigo gli cresce il naso.
- * XVIII Pinocchio ritrova la Volpe e il Gatto, e va con loro a seminare le quattro monete nel Campo de’ Miracoli.
- * XIX Pinocchio è derubato delle sue monete d’oro e, per gastigo, si busca quattro mesi di prigione.
- * XX Liberato dalla prigione, si avvia per tornare a casa della Fata; ma lungo la strada trova un serpente orribile, e poi rimane preso alla tagliuola.
- * XXI Pinocchio è preso da un contadino, il quale lo costringe a far da can da guardia a un pollaio.
- * XXII Pinocchio scuopre i ladri e, in ricompensa di essere stato fedele, vien posto in libertà.
- * XXIII Pinocchio piange la morte della bella Bambina dai capelli turchini: poi trova un Colombo che lo porta sulla riva del mare, e lì si getta nell’acqua per andare in aiuto del suo babbo Geppetto.
- * XXIV Pinocchio arriva all’isola delle Api industriose e ritrova la Fata.
- * XXV Pinocchio promette alla Fata di essere buono e di studiare, perché è stufo di fare il burattino e vuol diventare un bravo ragazzo.
- * XXVI Pinocchio va co’ suoi compagni di scuola in riva al mare, per vedere il terribile Pescecane.
- * XXVII Gran combattimento fra Pinocchio e i suoi compagni: uno de’ quali essendo rimasto ferito, Pinocchio viene arrestato dai carabinieri.
- * XXVIII Pinocchio corre pericolo di essere fritto in padella come un pesce.
- * XXIX Ritorna a casa della Fata, la quale gli promette che il giorno dopo non sarà più un burattino, ma diventerà un ragazzo. Gran colazione di caffè-e-latte per festeggiare questo grande avvenimento.
- * XXX Pinocchio, invece di diventare un ragazzo, parte di nascosto col suo amico Lucignolo per il Paese dei Balocchi.
- * XXXI Dopo cinque mesi di cuccagna, Pinocchio, con sua grande maraviglia, sente spuntarsi un bel paio d’orecchie asinine e diventa un ciuchino, con la coda e tutto.
- * XXXII A Pinocchio gli vengono gli orecchi di ciuco, e poi diventa un ciuchino vero e comincia a ragliare.
- * XXXIII Diventato un ciuchino vero, è portato a vendere, e lo compra il direttore di una compagnia di pagliacci per insegnargli a ballare e a saltare i cerchi; ma una sera azzoppisce e allora lo ricompra un altro, per far con la sua pelle un tamburo.
- * XXXIV Pinocchio, gettato in mare, è mangiato dai pesci e ritorna ad essere un burattino come prima; ma mentre nuota per salvarsi, è ingoiato dal terribile Pesce-cane.
- * XXXV Pinocchio ritrova in corpo al Pesce-cane... Chi ritrova? Leggete questo capitolo e lo saprete.
- * XXXVI Finalmente Pinocchio cessa d’essere un burattino e diventa un ragazzo.
+ * UNA NOTTE BIZZARRA
*
- * @see http://www.liberliber.it/libri/c/collodi/index.php#elenco_opere
+ * A LUIGI MORANDI
+ *
+ *
+ * _La è proprio una inezia, frutto di tre giorni di lavoro, che intitolo
+ * a te, giovine amico e compagno d'armi; ma sappi che fu un gaio lavoro
+ * campestre, e lavoro gaio riesce facile, e val meglio assai che sudato,
+ * ma uggioso._
+ *
+ * _Nè paia fuor del naturale a te, nè ai lettori cortesi, che i
+ * personaggi della mia novella s'innamorino in una notte. Anco a non
+ * volerne cercar la ragione, la scusa, nella novità de' casi narrati, io
+ * so che la cosa non è poi tanto difficile, io che ti ho per la prima
+ * volta veduto, ed amato come fratello, in un giorno. Tu dirai che,
+ * anche là, era quistione d'urgenza, imperocchè chi poteva morire il
+ * giorno di poi non avea tempo da perdere. Or dunque, concediamo la
+ * parte loro agli eventi, e non se ne parli più, se non per ricordare
+ * che l'amicizia, nata e cresciuta in un giorno, ha da fortificarsi in
+ * tutti que' molti, o pochi, che ci comporranno la trama della vita._
+ *
+ * Di Genova, il 19 di Luglio del 1868.
+ *
+ * ANTON GIULIO BARRILI.
+ *
+ * @see https://gutenberg.org/cache/epub/29636/pg29636.txt
*
* @var string
*/
protected static $baseText = <<<'EOT'
-I. Come andò che maestro Ciliegia, falegname, trovò un pezzo di legno, che piangeva e rideva come un bambino.
-
-C’era una volta...
-– Un re! – diranno subito i miei piccoli lettori.
-No, ragazzi, avete sbagliato. C’era una volta un pezzo di legno.
-Non era un legno di lusso, ma un semplice pezzo da catasta, di quelli che d’inverno si mettono nelle stufe e nei caminetti per accendere il fuoco e per riscaldare le stanze.
-Non so come andasse, ma il fatto gli è che un bel giorno questo pezzo di legno capitò nella bottega di un vecchio falegname, il quale aveva nome mastr’Antonio, se non che tutti lo chiamavano maestro Ciliegia, per via della punta del suo naso, che era sempre lustra e paonazza, come una ciliegia matura.
-Appena maestro Ciliegia ebbe visto quel pezzo di legno, si rallegrò tutto e dandosi una fregatina di mani per la contentezza, borbottò a mezza voce:
-– Questo legno è capitato a tempo: voglio servirmene per fare una gamba di tavolino.
-Detto fatto, prese subito l’ascia arrotata per cominciare a levargli la scorza e a digrossarlo, ma quando fu lì per lasciare andare la prima asciata, rimase col braccio sospeso in aria, perché sentì una vocina sottile, che disse raccomandandosi:
-– Non mi picchiar tanto forte!
-Figuratevi come rimase quel buon vecchio di maestro Ciliegia!
-Girò gli occhi smarriti intorno alla stanza per vedere di dove mai poteva essere uscita quella vocina, e non vide nessuno! Guardò sotto il banco, e nessuno; guardò dentro un armadio che stava sempre chiuso, e nessuno; guardò nel corbello dei trucioli e della segatura, e nessuno; apri l’uscio di bottega per dare un’occhiata anche sulla strada, e nessuno! O dunque?...
-– Ho capito; – disse allora ridendo e grattandosi la parrucca, – si vede che quella vocina me la sono figurata io. Rimettiamoci a lavorare.
-E ripresa l’ascia in mano, tirò giù un solennissimo colpo sul pezzo di legno.
-– Ohi! tu m’hai fatto male! – gridò rammaricandosi la solita vocina.
-Questa volta maestro Ciliegia restò di stucco, cogli occhi fuori del capo per la paura, colla bocca spalancata e colla lingua giù ciondoloni fino al mento, come un mascherone da fontana. Appena riebbe l’uso della parola, cominciò a dire tremando e balbettando dallo spavento:
-– Ma di dove sarà uscita questa vocina che ha detto ohi?... Eppure qui non c’è anima viva. Che sia per caso questo pezzo di legno che abbia imparato a piangere e a lamentarsi come un bambino? Io non lo posso credere. Questo legno eccolo qui; è un pezzo di legno da caminetto, come tutti gli altri, e a buttarlo sul fuoco, c’è da far bollire una pentola di fagioli... O dunque? Che ci sia nascosto dentro qualcuno? Se c’è nascosto qualcuno, tanto peggio per lui. Ora l’accomodo io!
-E così dicendo, agguantò con tutt’e due le mani quel povero pezzo di legno e si pose a sbatacchiarlo senza carità contro le pareti della stanza.
-Poi si messe in ascolto, per sentire se c’era qualche vocina che si lamentasse. Aspettò due minuti, e nulla; cinque minuti, e nulla; dieci minuti, e nulla!
-– Ho capito, – disse allora sforzandosi di ridere e arruffandosi la parrucca, – si vede che quella vocina che ha detto ohi, me la sono figurata io! Rimettiamoci a lavorare.
-E perché gli era entrata addosso una gran paura, si provò a canterellare per farsi un po’ di coraggio.
-Intanto, posata da una parte l’ascia, prese in mano la pialla, per piallare e tirare a pulimento il pezzo di legno; ma nel mentre che lo piallava in su e in giù, senti la solita vocina che gli disse ridendo:
-– Smetti! tu mi fai il pizzicorino sul corpo!
-Questa volta il povero maestro Ciliegia cadde giù come fulminato. Quando riaprì gli occhi, si trovò seduto per terra.
-Il suo viso pareva trasfigurato, e perfino la punta del naso, di paonazza come era quasi sempre, gli era diventata turchina dalla gran paura.
-
-II. Maestro Ciliegia regala il pezzo di legno al suo amico Geppetto, il quale lo prende per fabbricarsi un burattino maraviglioso che sappia ballare, tirar di scherma e fare i salti mortali.
-
-In quel punto fu bussato alla porta.
-– Passate pure, – disse il falegname, senza aver la forza di rizzarsi in piedi.
-Allora entrò in bottega un vecchietto tutto arzillo, il quale aveva nome Geppetto; ma i ragazzi del vicinato, quando lo volevano far montare su tutte le furie, lo chiamavano col soprannome di Polendina, a motivo della sua parrucca gialla che somigliava moltissimo alla polendina di granturco.
-Geppetto era bizzosissimo. Guai a chiamarlo Polendina! Diventava subito una bestia e non c’era più verso di tenerlo.
-– Buon giorno, mastr’Antonio, – disse Geppetto. – Che cosa fate costì per terra?
-– Insegno l’abbaco alle formicole.
-– Buon pro vi faccia!
-– Chi vi ha portato da me, compar Geppetto?
-– Le gambe. Sappiate, mastr’Antonio, che son venuto da voi, per chiedervi un favore.
-– Eccomi qui, pronto a servirvi, – replicò il falegname, rizzandosi su i ginocchi.
-– Stamani m’è piovuta nel cervello un’idea.
-– Sentiamola.
-– Ho pensato di fabbricarmi da me un bel burattino di legno; ma un burattino maraviglioso, che sappia ballare, tirare di scherma e fare i salti mortali. Con questo burattino voglio girare il mondo, per buscarmi un tozzo di pane e un bicchier di vino; che ve ne pare?
-– Bravo Polendina! – gridò la solita vocina, che non si capiva di dove uscisse.
-A sentirsi chiamar Polendina, compar Geppetto diventò rosso come un peperone dalla bizza, e voltandosi verso il falegname, gli disse imbestialito:
-– Perché mi offendete?
-– Chi vi offende?
-– Mi avete detto Polendina!...
-– Non sono stato io.
-– Sta’ un po’ a vedere che sarò stato io! Io dico che siete stato voi.
-– No!
-– Si!
-– No!
-– Si!
-E riscaldandosi sempre più, vennero dalle parole ai fatti, e acciuffatisi fra di loro, si graffiarono, si morsero e si sbertucciarono.
-Finito il combattimento, mastr’Antonio si trovò fra le mani la parrucca gialla di Geppetto, e Geppetto si accorse di avere in bocca la parrucca brizzolata del falegname.
-– Rendimi la mia parrucca! – gridò mastr’Antonio.
-– E tu rendimi la mia, e rifacciamo la pace.
-I due vecchietti, dopo aver ripreso ognuno di loro la propria parrucca, si strinsero la mano e giurarono di rimanere buoni amici per tutta la vita.
-– Dunque, compar Geppetto, – disse il falegname in segno di pace fatta, – qual è il piacere che volete da me?
-– Vorrei un po’ di legno per fabbricare il mio burattino; me lo date?
-Mastr’Antonio, tutto contento, andò subito a prendere sul banco quel pezzo di legno che era stato cagione a lui di tante paure. Ma quando fu lì per consegnarlo all’amico, il pezzo di legno dette uno scossone e sgusciandogli violentemente dalle mani, andò a battere con forza negli stinchi impresciuttiti del povero Geppetto.
-– Ah! gli è con questo bel garbo, mastr’Antonio, che voi regalate la vostra roba? M’avete quasi azzoppito!...
-– Vi giuro che non sono stato io!
-– Allora sarò stato io!...
-– La colpa è tutta di questo legno...
-– Lo so che è del legno: ma siete voi che me l’avete tirato nelle gambe!
-– Io non ve l’ho tirato!
-– Bugiardo!
-– Geppetto, non mi offendete; se no vi chiamo Polendina!...
-– Asino!
-– Polendina!
-– Somaro!
-– Polendina!
-– Brutto scimmiotto!
-– Polendina!
-A sentirsi chiamar Polendina per la terza volta, Geppetto perse il lume degli occhi, si avvento sul falegname; e lì se ne dettero un sacco e una sporta.
-A battaglia finita, mastr’Antonio si trovo due graffi di più sul naso, e quell’altro due bottoni di meno al giubbetto. Pareggiati in questo modo i loro conti, si strinsero la mano e giurarono di rimanere buoni amici per tutta la vita.
-Intanto Geppetto prese con se il suo bravo pezzo di legno, e ringraziato mastr’Antonio, se ne tornò zoppicando a casa.
-
-III Geppetto, tornato a casa, comincia subito a fabbricarsi il burattino e gli mette il nome di Pinocchio. Prime monellerie del burattino.
-
-La casa di Geppetto era una stanzina terrena, che pigliava luce da un sottoscala. La mobilia non poteva essere più semplice: una seggiola cattiva, un letto poco buono e un tavolino tutto rovinato. Nella parete di fondo si vedeva un caminetto col fuoco acceso; ma il fuoco era dipinto, e accanto al fuoco c’era dipinta una pentola che bolliva allegramente e mandava fuori una nuvola di fumo, che pareva fumo davvero.
-Appena entrato in casa, Geppetto prese subito gli arnesi e si pose a intagliare e a fabbricare il suo burattino.
-– Che nome gli metterò? – disse fra sé e sé. – Lo voglio chiamar Pinocchio. Questo nome gli porterà fortuna. Ho conosciuto una famiglia intera di Pinocchi: Pinocchio il padre, Pinocchia la madre e Pinocchi i ragazzi, e tutti se la passavano bene. Il più ricco di loro chiedeva l’elemosina.
-Quando ebbe trovato il nome al suo burattino, allora cominciò a lavorare a buono, e gli fece subito i capelli, poi la fronte, poi gli occhi.
-Fatti gli occhi, figuratevi la sua maraviglia quando si accorse che gli occhi si muovevano e che lo guardavano fisso fisso.
-Geppetto, vedendosi guardare da quei due occhi di legno, se n’ebbe quasi per male, e disse con accento risentito:
-– Occhiacci di legno, perché mi guardate?
-Nessuno rispose.
-Allora, dopo gli occhi, gli fece il naso; ma il naso, appena fatto, cominciò a crescere: e cresci, cresci, cresci diventò in pochi minuti un nasone che non finiva mai.
-Il povero Geppetto si affaticava a ritagliarlo; ma più lo ritagliava e lo scorciva, e più quel naso impertinente diventava lungo.
-Dopo il naso, gli fece la bocca.
-La bocca non era ancora finita di fare, che cominciò subito a ridere e a canzonarlo.
-– Smetti di ridere! – disse Geppetto impermalito; ma fu come dire al muro.
-– Smetti di ridere, ti ripeto! – urlò con voce minacciosa.
-Allora la bocca smesse di ridere, ma cacciò fuori tutta la lingua.
-Geppetto, per non guastare i fatti suoi, finse di non avvedersene, e continuò a lavorare.
-Dopo la bocca, gli fece il mento, poi il collo, le spalle, lo stomaco, le braccia e le mani.
-Appena finite le mani, Geppetto senti portarsi via la parrucca dal capo. Si voltò in su, e che cosa vide? Vide la sua parrucca gialla in mano del burattino.
-– Pinocchio!... rendimi subito la mia parrucca!
-E Pinocchio, invece di rendergli la parrucca, se la messe in capo per sé, rimanendovi sotto mezzo affogato.
-A quel garbo insolente e derisorio, Geppetto si fece triste e melanconico, come non era stato mai in vita sua, e voltandosi verso Pinocchio, gli disse:
-– Birba d’un figliuolo! Non sei ancora finito di fare, e già cominci a mancar di rispetto a tuo padre! Male, ragazzo mio, male!
-E si rasciugò una lacrima.
-Restavano sempre da fare le gambe e i piedi.
-Quando Geppetto ebbe finito di fargli i piedi, sentì arrivarsi un calcio sulla punta del naso.
-– Me lo merito! – disse allora fra sé. – Dovevo pensarci prima! Ormai è tardi!
-Poi prese il burattino sotto le braccia e lo posò in terra, sul pavimento della stanza, per farlo camminare.
-Pinocchio aveva le gambe aggranchite e non sapeva muoversi, e Geppetto lo conduceva per la mano per insegnargli a mettere un passo dietro l’altro.
-Quando le gambe gli si furono sgranchite, Pinocchio cominciò a camminare da sé e a correre per la stanza; finché, infilata la porta di casa, saltò nella strada e si dette a scappare.
-E il povero Geppetto a corrergli dietro senza poterlo raggiungere, perché quel birichino di Pinocchio andava a salti come una lepre, e battendo i suoi piedi di legno sul lastrico della strada, faceva un fracasso, come venti paia di zoccoli da contadini.
-– Piglialo! piglialo! – urlava Geppetto; ma la gente che era per la via, vedendo questo burattino di legno, che correva come un barbero, si fermava incantata a guardarlo, e rideva, rideva e rideva, da non poterselo figurare.
-Alla fine, e per buona fortuna, capitò un carabiniere, il quale, sentendo tutto quello schiamazzo e credendo si trattasse di un puledro che avesse levata la mano al padrone, si piantò coraggiosamente a gambe larghe in mezzo alla strada, coll’animo risoluto di fermarlo e di impedire il caso di maggiori disgrazie.
-Ma Pinocchio, quando si avvide da lontano del carabiniere che barricava tutta la strada, s’ingegnò di passargli, per sorpresa, frammezzo alle gambe, e invece fece fiasco.
-Il carabiniere, senza punto smoversi, lo acciuffò pulitamente per il naso (era un nasone spropositato, che pareva fatto apposta per essere acchiappato dai carabinieri), e lo riconsegnò nelle proprie mani di Geppetto; il quale, a titolo di correzione, voleva dargli subito una buona tiratina d’orecchi. Ma figuratevi come rimase quando, nel cercargli gli orecchi, non gli riuscì di poterli trovare: e sapete perché? Perché, nella furia di scolpirlo, si era dimenticato di farglieli.
-Allora lo prese per la collottola, e, mentre lo riconduceva indietro, gli disse tentennando minacciosamente il capo:
-– Andiamo a casa. Quando saremo a casa, non dubitare che faremo i nostri conti!
-Pinocchio, a questa antifona, si buttò per terra, e non volle più camminare. Intanto i curiosi e i bighelloni principiavano a fermarsi lì dintorno e a far capannello.
-Chi ne diceva una, chi un’altra.
-– Povero burattino! – dicevano alcuni, – ha ragione a non voler tornare a casa! Chi lo sa come lo picchierebbe quell’omaccio di Geppetto!...
-E gli altri soggiungevano malignamente:
-– Quel Geppetto pare un galantuomo! ma è un vero tiranno coi ragazzi! Se gli lasciano quel povero burattino fra le mani, è capacissimo di farlo a pezzi!...
-Insomma, tanto dissero e tanto fecero, che il carabiniere rimise in libertà Pinocchio e condusse in prigione quel pover’uomo di Geppetto. Il quale, non avendo parole lì per lì per difendersi, piangeva come un vitellino, e nell’avviarsi verso il carcere, balbettava singhiozzando:
-– Sciagurato figliuolo! E pensare che ho penato tanto a farlo un burattino per bene! Ma mi sta il dovere! Dovevo pensarci prima!...
-Quello che accadde dopo, è una storia da non potersi credere, e ve la racconterò in quest’altri capitoli.
-
-IV La storia di Pinocchio col Grillo-parlante, dove si vede come i ragazzi cattivi hanno a noia di sentirsi correggere da chi ne sa più di loro.
-
-Vi dirò dunque, ragazzi, che mentre il povero Geppetto era condotto senza sua colpa in prigione, quel monello di Pinocchio, rimasto libero dalle grinfie del carabiniere, se la dava a gambe giù attraverso ai campi, per far più presto a tornarsene a casa; e nella gran furia del correre saltava greppi altissimi, siepi di pruni e fossi pieni d’acqua, tale e quale come avrebbe potuto fare un capretto o un leprottino inseguito dai cacciatori.
-Giunto dinanzi a casa, trovò l’uscio di strada socchiuso. Lo spinse, entrò dentro, e appena ebbe messo tanto di paletto, si gettò a sedere per terra, lasciando andare un gran sospirone di contentezza.
-Ma quella contentezza durò poco, perché sentì nella stanza qualcuno che fece:
-– Crì - crì - crì!
-– Chi è che mi chiama? – disse Pinocchio tutto impaurito.
-– Sono io!
-Pinocchio si voltò e vide un grosso Grillo che saliva lentamente su su per il muro.
-– Dimmi, Grillo: e tu chi sei?
-– Io sono il Grillo-parlante, ed abito in questa stanza da più di cent’anni.
-– Oggi però questa stanza è mia, – disse il burattino, – e se vuoi farmi un vero piacere, vattene subito, senza nemmeno voltarti indietro.
-– Io non me ne anderò di qui, – rispose il Grillo, – se prima non ti avrò detto una gran verità.
-– Dimmela e spìcciati.
-– Guai a quei ragazzi che si ribellano ai loro genitori e che abbandonano capricciosamente la casa paterna! Non avranno mai bene in questo mondo; e prima o poi dovranno pentirsene amaramente.
-– Canta pure, Grillo mio, come ti pare e piace: ma io so che domani, all’alba, voglio andarmene di qui, perché se rimango qui, avverrà a me quel che avviene a tutti gli altri ragazzi, vale a dire mi manderanno a scuola e per amore o per forza mi toccherà studiare; e io, a dirtela in confidenza, di studiare non ne ho punto voglia e mi diverto più a correre dietro alle farfalle e a salire su per gli alberi a prendere gli uccellini di nido.
-– Povero grullerello! Ma non sai che, facendo così, diventerai da grande un bellissimo somaro e che tutti si piglieranno gioco di te?
-– Chétati. Grillaccio del mal’augurio! – gridò Pinocchio.
-Ma il Grillo, che era paziente e filosofo, invece di aversi a male di questa impertinenza, continuò con lo stesso tono di voce:
-– E se non ti garba di andare a scuola, perché non impari almeno un mestiere, tanto da guadagnarti onestamente un pezzo di pane?
-– Vuoi che te lo dica? – replicò Pinocchio, che cominciava a perdere la pazienza. – Fra tutti i mestieri del mondo non ce n’è che uno solo, che veramente mi vada a genio.
-– E questo mestiere sarebbe?...
-– Quello di mangiare, bere, dormire, divertirmi e fare dalla mattina alla sera la vita del vagabondo.
-– Per tua regola, – disse il Grillo-parlante con la sua solita calma, – tutti quelli che fanno codesto mestiere finiscono sempre allo spedale o in prigione.
-– Bada, Grillaccio del mal’augurio!... se mi monta la bizza, guai a te!
-– Povero Pinocchio! Mi fai proprio compassione!...
-– Perché ti faccio compassione?
-– Perché sei un burattino e, quel che è peggio, perché hai la testa di legno.
-A queste ultime parole, Pinocchio saltò su tutt’infuriato e preso sul banco un martello di legno lo scagliò contro il Grillo-parlante.
-Forse non credeva nemmeno di colpirlo: ma disgraziatamente lo colse per l’appunto nel capo, tanto che il povero Grillo ebbe appena il fiato di fare crì - crì - crì, e poi rimase lì stecchito e appiccicato alla parete.
-
-V Pinocchio ha fame, e cerca un uovo per farsi una frittata; ma sul più bello, la frittata gli vola via dalla finestra.
-
-Intanto cominciò a farsi notte, e Pinocchio, ricordandosi che non aveva mangiato nulla, senti un’uggiolina allo stomaco, che somigliava moltissimo all’appetito.
-Ma l’appetito nei ragazzi cammina presto; e di fatti dopo pochi minuti l’appetito diventò fame, e la fame, dal vedere al non vedere, si converti in una fame da lupi, una fame da tagliarsi col coltello.
-Il povero Pinocchio corse subito al focolare, dove c’era una pentola che bolliva e fece l’atto di scoperchiarla, per vedere che cosa ci fosse dentro, ma la pentola era dipinta sul muro. Figuratevi come restò. Il suo naso, che era già lungo, gli diventò più lungo almeno quattro dita.
-Allora si dette a correre per la stanza e a frugare per tutte le cassette e per tutti i ripostigli in cerca di un po’ di pane, magari un po’ di pan secco, un crosterello, un osso avanzato al cane, un po’ di polenta muffita, una lisca di pesce, un nocciolo di ciliegia, insomma di qualche cosa da masticare: ma non trovò nulla, il gran nulla, proprio nulla.
-E intanto la fame cresceva, e cresceva sempre: e il povero Pinocchio non aveva altro sollievo che quello di sbadigliare: e faceva degli sbadigli così lunghi, che qualche volta la bocca gli arrivava fino agli orecchi. E dopo avere sbadigliato, sputava, e sentiva che lo stomaco gli andava via.
-Allora piangendo e disperandosi, diceva:
-– Il Grillo-parlante aveva ragione. Ho fatto male a rivoltarmi al mio babbo e a fuggire di casa... Se il mio babbo fosse qui, ora non mi troverei a morire di sbadigli! Oh! che brutta malattia che è la fame!
-Quand’ecco gli parve di vedere nel monte della spazzatura qualche cosa di tondo e di bianco, che somigliava tutto a un uovo di gallina. Spiccare un salto e gettarvisi sopra, fu un punto solo. Era un uovo davvero.
-La gioia del burattino è impossibile descriverla: bisogna sapersela figurare. Credendo quasi che fosse un sogno, si rigirava quest’uovo fra le mani, e lo toccava e lo baciava, e baciandolo diceva:
-– E ora come dovrò cuocerlo? Ne farò una frittata?... No, è meglio cuocerlo nel piatto!... O non sarebbe più saporito se lo friggessi in padella? O se invece lo cuocessi a uso uovo da bere? No, la più lesta di tutte è di cuocerlo nel piatto o nel tegamino: ho troppa voglia di mangiarmelo!
-Detto fatto, pose un tegamino sopra un caldano pieno di brace accesa: messe nel tegamino, invece d’olio o di burro, un po’ d’acqua: e quando l’acqua principiò a fumare, tac!... spezzò il guscio dell’uovo, e fece l’atto di scodellarvelo dentro.
-Ma invece della chiara e del torlo, scappò fuori un pulcino tutto allegro e complimentoso, il quale, facendo una bella riverenza, disse:
-– Mille grazie, signor Pinocchio, d’avermi risparmiata la fatica di rompere il guscio! Arrivedella, stia bene e tanti saluti a casa!
-Ciò detto distese le ali e, infilata la finestra che era aperta, se ne volò via a perdita d’occhio.
-Il povero burattino rimase lì, come incantato, cogli occhi fissi, colla bocca aperta e coi gusci dell’uovo in mano. Riavutosi, peraltro, dal primo sbigottimento, cominciò a piangere, a strillare, a battere i piedi in terra, per la disperazione, e piangendo diceva:
-– Eppure il Grillo-parlante aveva ragione! Se non fossi scappato di casa e se il mio babbo fosse qui, ora non mi troverei a morire di fame! Oh! che brutta malattia che è la fame!...
-E perché il corpo gli seguitava a brontolare più che mai, e non sapeva come fare a chetarlo, pensò di uscir di casa e di dare una scappata al paesello vicino, nella speranza di trovare qualche persona caritatevole che gli avesse fatto l’elemosina di un po’ di pane.
-
-VI Pinocchio si addormenta coi piedi sul caldano, e la mattina dopo si sveglia coi piedi tutti bruciati.
-
-Per l’appunto era una nottataccia d’inferno. Tuonava forte forte, lampeggiava come se il cielo pigliasse fuoco, e un ventaccio freddo e strapazzone, fischiando rabbiosamente e sollevando un immenso nuvolo di polvere, faceva stridere e cigolare tutti gli alberi della campagna.
-Pinocchio aveva una gran paura dei tuoni e dei lampi: se non che la fame era più forte della paura: motivo per cui accostò l’uscio di casa, e presa la carriera, in un centinaio di salti arrivò fino al paese, colla lingua fuori e col fiato grosso, come un cane da caccia.
-Ma trovò tutto buio e tutto deserto. Le botteghe erano chiuse; le porte di casa chiuse; le finestre chiuse; e nella strada nemmeno un cane. Pareva il paese dei morti.
-Allora Pinocchio, preso dalla disperazione e dalla fame, si attaccò al campanello d’una casa, e cominciò a suonare a distesa, dicendo dentro di sé:
-– Qualcuno si affaccierà.
-Difatti si affacciò un vecchino, col berretto da notte in capo, il quale gridò tutto stizzito:
-– Che cosa volete a quest’ora?
-– Che mi fareste il piacere di darmi un po’ di pane?
-– Aspettami costì che torno subito, – rispose il vecchino, credendo di aver da fare con qualcuno di quei ragazzacci rompicollo che si divertono di notte a suonare i campanelli delle case, per molestare la gente per bene, che se la dorme tranquillamente.
-Dopo mezzo minuto la finestra si riaprì e la voce del solito vecchino gridò a Pinocchio:
-– Fatti sotto e para il cappello.
-Pinocchio si levò subito il suo cappelluccio; ma mentre faceva l’atto di pararlo, sentì pioversi addosso un’enorme catinellata d’acqua che lo annaffiò tutto dalla testa ai piedi, come se fosse un vaso di giranio appassito.
-Tornò a casa bagnato come un pulcino e rifinito dalla stanchezza e dalla fame e perché non aveva più forza di reggersi ritto, si pose a sedere, appoggiando i piedi fradici e impillaccherati sopra un caldano pieno di brace accesa.
-E lì si addormentò; e nel dormire, i piedi che erano di legno, gli presero fuoco e adagio adagio gli si carbonizzarono e diventarono cenere.
-E Pinocchio seguitava a dormire e a russare, come se i suoi piedi fossero quelli d’un altro. Finalmente sul far del giorno si svegliò, perché qualcuno aveva bussato alla porta.
-– Chi è? – domandò sbadigliando e stropicciandosi gli occhi.
-– Sono io, – rispose una voce.
-Quella voce era la voce di Geppetto.
-
-VII Geppetto torna a casa, e dà al burattino la colazione che il pover’uomo aveva portata con sé.
-
-Il povero Pinocchio, che aveva sempre gli occhi fra il sonno, non s’era ancora avvisto dei piedi, che gli si erano tutti bruciati: per cui appena sentì la voce di suo padre, schizzò giù dallo sgabello per correre a tirare il paletto; ma invece, dopo due o tre traballoni, cadde di picchio tutto lungo disteso sul pavimento.
-E nel battere in terra fece lo stesso rumore, che avrebbe fatto un sacco di mestoli. cascato da un quinto piano.
-– Aprimi! – intanto gridava Geppetto dalla strada.
-– Babbo mio, non posso, – rispondeva il burattino piangendo e ruzzolandosi per terra.
-– Perché non puoi?
-– Perché mi hanno mangiato i piedi.
-– E chi te li ha mangiati?
-– Il gatto, – disse Pinocchio, vedendo il gatto che colle zampine davanti si divertiva a far ballare alcuni trucioli di legno.
-– Aprimi, ti dico! – ripeté Geppetto, – se no quando vengo in casa, il gatto te lo do io!
-– Non posso star ritto, credetelo. O povero me! povero me che mi toccherà a camminare coi ginocchi per tutta la vita!...
-Geppetto, credendo che tutti questi piagnistei fossero un’altra monelleria del burattino, pensò bene di farla finita, e arrampicatosi su per il muro, entrò in casa dalla finestra.
-Da principio voleva dire e voleva fare: ma poi quando vide il suo Pinocchio sdraiato in terra e rimasto senza piedi davvero, allora sentì intenerirsi; e presolo subito in collo, si dette a baciarlo e a fargli mille carezze e mille moine, e, coi luccioloni che gli cascavano giù per le gote, gli disse singhiozzando:
-– Pinocchiuccio mio! Com’è che ti sei bruciato i piedi?
-– Non lo so, babbo, ma credetelo che è stata una nottata d’inferno e me ne ricorderò fin che campo. Tonava, balenava e io avevo una gran fame e allora il Grillo-parlante mi disse: «Ti sta bene; sei stato cattivo, e te lo meriti», e io gli dissi: «Bada, Grillo!...», e lui mi disse: «Tu sei un burattino e hai la testa di legno» e io gli tirai un martello di legno, e lui morì ma la colpa fu sua, perché io non volevo ammazzarlo, prova ne sia che messi un tegamino sulla brace accesa del caldano, ma il pulcino scappò fuori e disse: «Arrivedella... e tanti saluti a casa» e la fame cresceva sempre, motivo per cui quel vecchino col berretto da notte, affacciandosi alla finestra mi disse: «Fatti sotto e para il cappello» e io con quella catinellata d’acqua sul capo, perché il chiedere un po’ di pane non è vergogna, non è vero? me ne tornai subito a casa, e perché avevo sempre una gran fame, messi i piedi sul caldano per rasciugarmi, e voi siete tornato, e me li sono trovati bruciati, e intanto la fame l’ho sempre e i piedi non li ho più! Ih!... ih!... ih!... ih!...
-E il povero Pinocchio cominciò a piangere e a berciare così forte, che lo sentivano da cinque chilometri lontano.
-Geppetto, che di tutto quel discorso arruffato aveva capito una cosa sola, cioè che il burattino sentiva morirsi dalla gran fame, tirò fuori di tasca tre pere, e porgendogliele, disse:
-– Queste tre pere erano per la mia colazione: ma io te le do volentieri. Mangiale, e buon pro ti faccia.
-– Se volete che le mangi, fatemi il piacere di sbucciarle.
-– Sbucciarle? – replicò Geppetto meravigliato. – Non avrei mai creduto, ragazzo, mio, che tu fossi così boccuccia e così schizzinoso di palato. Male! In questo mondo, fin da bambini, bisogna avvezzarsi abboccati e a saper mangiare di tutto, perché non si sa mai quel che ci può capitare. I casi son tanti!...
-– Voi direte bene, – soggiunse Pinocchio, – ma io non mangerò mai una frutta, che non sia sbucciata. Le bucce non le posso soffrire.
-E quel buon uomo di Geppetto, cavato fuori un coltellino, e armatosi di santa pazienza, sbucciò le tre pere, e pose tutte le bucce sopra un angolo della tavola.
-Quando Pinocchio in due bocconi ebbe mangiata la prima pera, fece l’atto di buttar via il torsolo: ma Geppetto gli trattenne il braccio, dicendogli:
-– Non lo buttar via: tutto in questo mondo può far comodo.
-– Ma io il torsolo non lo mangio davvero!... – gridò il burattino, rivoltandosi come una vipera.
-– Chi lo sa! I casi son tanti!... – ripeté Geppetto, senza riscaldarsi.
-Fatto sta che i tre torsoli, invece di essere gettati fuori dalla finestra, vennero posati sull’angolo della tavola in compagnia delle bucce.
-Mangiate o, per dir meglio, divorate le tre pere, Pinocchio fece un lunghissimo sbadiglio e disse piagnucolando:
-– Ho dell’altra fame!
-– Ma io, ragazzo mio, non ho più nulla da darti.
-– Proprio nulla, nulla?
-– Ci avrei soltanto queste bucce e questi torsoli di pera.
-– Pazienza! – disse Pinocchio, – se non c’è altro, mangerò una buccia.
-E cominciò a masticare. Da principio storse un po’ la bocca; ma poi, una dietro l’altra, spolverò in un soffio tutte le bucce: e dopo le bucce, anche i torsoli, e quand’ebbe finito di mangiare ogni cosa, si batté tutto contento le mani sul corpo, e disse gongolando:
-– Ora sì che sto bene!
-– Vedi dunque, – osservò Geppetto, – che avevo ragione io quando ti dicevo che non bisogna avvezzarsi né troppo sofistici né troppo delicati di palato. Caro mio, non si sa mai quel che ci può capitare in questo mondo. I casi son tanti!...
-
-VIII Geppetto rifà i piedi a Pinocchio e vende la propria casacca per comprargli l’Abbecedario.
-
-Il burattino, appena che si fu levata la fame, cominciò subito a bofonchiare e a piangere, perché voleva un paio di piedi nuovi.
-Ma Geppetto, per punirlo della monelleria fatta lo lasciò piangere e disperarsi per una mezza giornata: poi gli disse:
-– E perché dovrei rifarti i piedi? Forse per vederti scappar di nuovo da casa tua?
-– Vi prometto, – disse il burattino singhiozzando, – che da oggi in poi sarò buono...
-– Tutti i ragazzi, – replicò Geppetto, – quando vogliono ottenere qualcosa, dicono così.
-– Vi prometto che anderò a scuola, studierò e mi farò onore...
-– Tutti i ragazzi, quando vogliono ottenere qualcosa, ripetono la medesima storia.
-– Ma io non sono come gli altri ragazzi! Io sono più buono di tutti e dico sempre la verità. Vi prometto, babbo, che imparerò un’arte e che sarò la consolazione e il bastone della vostra vecchiaia.
-Geppetto che, sebbene facesse il viso di tiranno, aveva gli occhi pieni di pianto e il cuore grosso dalla passione di vedere il suo povero Pinocchio in quello stato compassionevole, non rispose altre parole: ma, presi in mano gli arnesi del mestiere e due pezzetti di legno stagionato, si pose a lavorare di grandissimo impegno.
-E in meno d’un’ora, i piedi erano bell’e fatti; due piedini svelti, asciutti e nervosi, come se fossero modellati da un artista di genio.
-Allora Geppetto disse al burattino:
-– Chiudi gli occhi e dormi!
-E Pinocchio chiuse gli occhi e fece finta di dormire. E nel tempo che si fingeva addormentato, Geppetto con un po’ di colla sciolta in un guscio d’uovo gli appiccicò i due piedi al loro posto, e glieli appiccicò così bene, che non si vedeva nemmeno il segno dell’attaccatura.
-Appena il burattino si accorse di avere i piedi, saltò giù dalla tavola dove stava disteso, e principiò a fare mille sgambetti e mille capriole, come se fosse ammattito dalla gran contentezza.
-– Per ricompensarvi di quanto avete fatto per me, – disse Pinocchio al suo babbo, – voglio subito andare a scuola.
-– Bravo ragazzo!
-– Ma per andare a scuola ho bisogno d’un po’ di vestito.
-Geppetto, che era povero e non aveva in tasca nemmeno un centesimo, gli fece allora un vestituccio di carta fiorita, un paio di scarpe di scorza di albero e un berrettino di midolla di pane.
-Pinocchio corse subito a specchiarsi in una catinella piena d’acqua e rimase così contento di sé, che disse pavoneggiandosi:
-– Paio proprio un signore!
-– Davvero, – replicò Geppetto, – perché, tienlo a mente, non è il vestito bello che fa il signore. ma è piuttosto il vestito pulito.
-– A proposito, – soggiunse il burattino, – per andare alla scuola mi manca sempre qualcosa: anzi mi manca il più e il meglio.
-– Cioè?
-– Mi manca l’Abbecedario.
-– Hai ragione: ma come si fa per averlo?
-– È facilissimo: si va da un libraio e si compra.
-– E i quattrini?
-– Io non ce l’ho.
-– Nemmeno io, – soggiunse il buon vecchio, facendosi tristo.
-E Pinocchio, sebbene fosse un ragazzo allegrissimo, si fece tristo anche lui: perché la miseria, quando è miseria davvero, la intendono tutti: anche i ragazzi.
-– Pazienza! – gridò Geppetto tutt’a un tratto rizzandosi in piedi; e infilatasi la vecchia casacca di fustagno, tutta toppe e rimendi, uscì correndo di casa.
-Dopo poco tornò: e quando tornò aveva in mano l’Abbecedario per il figliuolo, ma la casacca non l’aveva più. Il pover’uomo era in maniche di camicia, e fuori nevicava.
-– E la casacca, babbo?
-– L’ho venduta.
-– Perché l’avete venduta?
-– Perché mi faceva caldo.
-Pinocchio capì questa risposta a volo, e non potendo frenare l’impeto del suo buon cuore, saltò al collo di Geppetto e cominciò a baciarlo per tutto il viso.
-
-IX Pinocchio vende l’Abbecedario per andare a vedere il teatrino dei burattini.
-
-Smesso che fu di nevicare, Pinocchio col suo bravo Abbecedario nuovo sotto il braccio, prese la strada che menava alla scuola: e strada facendo, fantasticava nel suo cervellino mille ragionamenti e mille castelli in aria, uno più bello dell’altro.
-E discorrendo da sé solo diceva:
-– Oggi, alla scuola, voglio subito imparare a leggere: domani poi imparerò a scrivere e domani l’altro imparerò a fare i numeri. Poi, colla mia abilità, guadagnerò molti quattrini e coi primi quattrini che mi verranno in tasca, voglio subito fare al mio babbo una bella casacca di panno. Ma che dico di panno? Gliela voglio fare tutta d’argento e d’oro, e coi bottoni di brillanti. E quel pover’uomo se la merita davvero: perché, insomma, per comprarmi i libri e per farmi istruire, è rimasto in maniche di camicia... a questi freddi! Non ci sono che i babbi che sieno capaci di certi sacrifizi!...
-Mentre tutto commosso diceva così gli parve di sentire in lontananza una musica di pifferi e di colpi di grancassa: pì-pì-pì, pì-pì-pì zum, zum, zum, zum.
-Si fermò e stette in ascolto. Quei suoni venivano di fondo a una lunghissima strada traversa, che conduceva a un piccolo paesetto fabbricato sulla spiaggia del mare.
-– Che cosa sia questa musica? Peccato che io debba andare a scuola, se no...
-E rimase lì perplesso. A ogni modo, bisognava prendere una risoluzione: o a scuola, o a sentire i pifferi.
-– Oggi anderò a sentire i pifferi, e domani a scuola: per andare a scuola c’è sempre tempo, – disse finalmente quel monello facendo una spallucciata.
-Detto fatto, infilò giù per la strada traversa, e cominciò a correre a gambe. Più correva e più sentiva distinto il suono dei pifferi e dei tonfi della grancassa: pì-pì-pì, pì-pì-pì… zum, zum, zum, zum.
-Quand’ecco che si trovò in mezzo a una piazza tutta piena di gente, la quale si affollava intorno a un gran baraccone di legno e di tela dipinta di mille colori.
-– Che cos’è quel baraccone? – domandò Pinocchio, voltandosi a un ragazzetto che era lì del paese.
-– Leggi il cartello, che c’è scritto, e lo saprai.
-– Lo leggerei volentieri, ma per l’appunto oggi non so leggere.
-– Bravo bue! Allora te lo leggerò io. Sappi dunque che in quel cartello a lettere rosse come il fuoco c’è scritto: GRAN TEATRO DEI BURATTINI...
-– È molto che è incominciata la commedia?
-– Comincia ora.
-– E quanto si spende per entrare?
-– Quattro soldi.
-Pinocchio, che aveva addosso la febbre della curiosità, perse ogni ritegno, e disse senza vergognarsi al ragazzetto, col quale parlava:
-– Mi daresti quattro soldi fino a domani?
-– Te li darei volentieri, – gli rispose l’altro canzonandolo, – ma oggi per l’appunto non te li posso dare.
-– Per quattro soldi, ti vendo la mia giacchetta, – gli disse allora il burattino.
-– Che vuoi che mi faccia di una giacchetta di carta fiorita? Se ci piove su, non c’è più verso di cavartela da dosso.
-– Vuoi comprare le mie scarpe?
-– Sono buone per accendere il fuoco.
-– Quanto mi dai del berretto?
-– Bell’acquisto davvero! Un berretto di midolla di pane! C’è il caso che i topi me lo vengano a mangiare in capo!
-Pinocchio era sulle spine. Stava lì lì per fare un’ultima offerta: ma non aveva coraggio; esitava, tentennava, pativa. Alla fine disse:
-– Vuoi darmi quattro soldi di quest’Abbecedario nuovo?
-– Io sono un ragazzo, e non compro nulla dai ragazzi, – gli rispose il suo piccolo interlocutore, che aveva molto più giudizio di lui.
-– Per quattro soldi l’Abbecedario lo prendo io, – gridò un rivenditore di panni usati, che s’era trovato presente alla conversazione.
-E il libro fu venduto lì sui due piedi. E pensare che quel pover’uomo di Geppetto era rimasto a casa, a tremare dal freddo in maniche di camicia, per comprare l’Abbecedario al figliuolo!
-
-X I burattini riconoscono il loro fratello Pinocchio e gli fanno una grandissima festa; ma sul più bello, esce fuori il burattinaio Mangiafoco, e Pinocchio corre il pericolo di fare una brutta fine.
-
-Quando Pinocchio entrò nel teatrino delle marionette, accadde un fatto che destò mezza rivoluzione.
-Bisogna sapere che il sipario era tirato su e la commedia era già incominciata.
-Sulla scena si vedevano Arlecchino e Pulcinella, che bisticciavano fra di loro e, secondo il solito, minacciavano da un momento all’altro di scambiarsi un carico di schiaffi e di bastonate.
-La platea, tutta attenta, si mandava a male dalle grandi risate, nel sentire il battibecco di quei due burattini, che gestivano e si trattavano d’ogni vitupero con tanta verità, come se fossero proprio due animali ragionevoli e due persone di questo mondo.
-Quando all’improvviso, che è che non è, Arlecchino smette di recitare, e voltandosi verso il pubblico e accennando colla mano qualcuno in fondo alla platea, comincia a urlare in tono drammatico:
-– Numi del firmamento! sogno o son desto? Eppure quello laggiù è Pinocchio!...
-– È Pinocchio davvero! – grida Pulcinella.
-– È proprio lui! – strilla la signora Rosaura, facendo capolino di fondo alla scena.
-– È Pinocchio! è Pinocchio! – urlano in coro tutti i burattini, uscendo a salti fuori delle quinte.
-– È Pinocchio! è il nostro fratello Pinocchio! Evviva Pinocchio.
-– Pinocchio, vieni quassù da me, – grida Arlecchino, – vieni a gettarti fra le braccia dei tuoi fratelli di legno!
-A questo affettuoso invito Pinocchio spicca un salto, e di fondo alla platea va nei posti distinti; poi con un altro salto, dai posti distinti monta sulla testa del direttore d’orchestra, e di lì schizza sul palcoscenico.
-È impossibile figurarsi gli abbracciamenti, gli strizzoni di collo, i pizzicotti dell’amicizia e le zuccate della vera e sincera fratellanza, che Pinocchio ricevé in mezzo a tanto arruffio dagli attori e dalle attrici di quella compagnia drammatico-vegetale.
-Questo spettacolo era commovente, non c’è che dire: ma il pubblico della platea, vedendo che la commedia non andava più avanti, s’impazientì e prese a gridare:
-– Vogliamo la commedia, vogliamo la commedia!
-Tutto fiato buttato via, perché i burattini, invece di continuare la recita, raddoppiarono il chiasso e le grida, e, postosi Pinocchio sulle spalle, se lo portarono in trionfo davanti ai lumi della ribalta.
-Allora uscì fuori il burattinaio, un omone così brutto, che metteva paura soltanto a guardarlo. Aveva una barbaccia nera come uno scarabocchio d’inchiostro, e tanto lunga che gli scendeva dal mento fino a terra: basta dire che, quando camminava, se la pestava coi piedi. La sua bocca era larga come un forno, i suoi occhi parevano due lanterne di vetro rosso, col lume acceso di dietro, e con le mani faceva schioccare una grossa frusta, fatta di serpenti e di code di volpe attorcigliate insieme.
-All’apparizione inaspettata del burattinaio, ammutolirono tutti: nessuno fiatò più. Si sarebbe sentito volare una mosca. Quei poveri burattini, maschi e femmine, tremavano tutti come tante foglie.
-– Perché sei venuto a mettere lo scompiglio nel mio teatro? – domandò il burattinaio a Pinocchio, con un vocione d’Orco gravemente infreddato di testa.
-– La creda, illustrissimo, che la colpa non è stata mia!...
-– Basta così! Stasera faremo i nostri conti.
-Difatti, finita la recita della commedia, il burattinaio andò in cucina, dov’egli s’era preparato per cena un bel montone, che girava lentamente infilato nello spiedo. E perché gli mancavano la legna per finirlo di cuocere e di rosolare, chiamò Arlecchino e Pulcinella e disse loro:
-– Portatemi di qua quel burattino che troverete attaccato al chiodo. Mi pare un burattino fatto di un legname molto asciutto, e sono sicuro che, a buttarlo sul fuoco, mi darà una bellissima fiammata all’arrosto.
-Arlecchino e Pulcinella da principio esitarono; ma impauriti da un’occhiataccia del loro padrone, obbedirono: e dopo poco tornarono in cucina, portando sulle braccia il povero Pinocchio, il quale, divincolandosi come un’anguilla fuori dell’acqua, strillava disperatamente:
-– Babbo mio, salvatemi! Non voglio morire, non voglio morire!...
-
-XI Mangiafoco starnutisce e perdona a Pinocchio, il quale poi difende dalla morte il suo amico Arlecchino.
-
-Il burattinaio Mangiafoco che (questo era il suo nome) pareva un uomo spaventoso, non dico di no, specie con quella sua barbaccia nera che, a uso grembiale, gli copriva tutto il petto e tutte le gambe; ma nel fondo poi non era un cattiv’uomo. Prova ne sia che quando vide portarsi davanti quel povero Pinocchio, che si dibatteva per ogni verso, urlando «Non voglio morire, non voglio morire!», principiò subito a commuoversi e a impietosirsi e, dopo aver resistito un bel pezzo, alla fine non ne poté più, e lasciò andare un sonorissimo starnuto.
-A quello starnuto, Arlecchino, che fin allora era stato afflitto e ripiegato come un salcio piangente, si fece tutto allegro in viso, e chinatosi verso Pinocchio, gli bisbigliò sottovoce:
-– Buone nuove, fratello. Il burattinaio ha starnutito, e questo è segno che s’è mosso a compassione per te, e oramai sei salvo.
-Perché bisogna sapere che, mentre tutti gli uomini, quando si sentono impietositi per qualcuno, o piangono o per lo meno fanno finta di rasciugarsi gli occhi, Mangiafoco, invece, ogni volta che s’inteneriva davvero, aveva il vizio di starnutire. Era un modo come un altro, per dare a conoscere agli altri la sensibilità del suo cuore.
-Dopo aver starnutito, il burattinaio, seguitando a fare il burbero, gridò a Pinocchio:
-– Finiscila di piangere! I tuoi lamenti mi hanno messo un’uggiolina in fondo allo stomaco... Sento uno spasimo, che quasi quasi... Etcì! etcì! – e fece altri due starnuti.
-– Felicità! – disse Pinocchio.
-– Grazie! E il tuo babbo e la tua mamma sono sempre vivi? – gli domandò Mangiafoco.
-– Il babbo, sì la mamma non l’ho mai conosciuta.
-– Chi lo sa che dispiacere sarebbe per il tuo vecchio padre, se ora ti facessi gettare fra quei carboni ardenti! Povero vecchio! lo compatisco!.. Etcì, etcì, etcì, – e fece altri tre starnuti.
-– Felicità! – disse Pinocchio.
-– Grazie! Del resto bisogna compatire anche me, perché, come vedi, non ho più legna per finire di cuocere quel montone arrosto, e tu, dico la verità, in questo caso mi avresti fatto un gran comodo! Ma oramai mi sono impietosito e ci vuol pazienza. Invece di te, metterò a bruciare sotto lo spiedo qualche burattino della mia Compagnia... Olà, giandarmi!
-A questo comando comparvero subito due giandarmi di legno, lunghi lunghi, secchi secchi, col cappello a lucerna in testa e colla sciabola sfoderata in mano.
-Allora il burattinaio disse loro con voce rantolosa:
-– Pigliatemi lì quell’Arlecchino, legatelo ben bene, e poi gettatelo a bruciare sul fuoco. Io voglio che il mio montone sia arrostito bene!
-Figuratevi il povero Arlecchino! Fu tanto il suo spavento, che le gambe gli si ripiegarono e cadde bocconi per terra.
-Pinocchio, alla vista di quello spettacolo straziante, andò a gettarsi ai piedi del burattinaio e piangendo dirottamente e bagnandogli di lacrime tutti i peli della lunghissima barba, cominciò a dire con voce supplichevole:
-– Pietà, signor Mangiafoco!...
-– Qui non ci son signori! – replicò duramente il burattinaio.
-– Pietà, signor Cavaliere!...
-– Qui non ci son cavalieri!
-– Pietà, signor Commendatore!...
-– Qui non ci son commendatori!
-– Pietà, Eccellenza!...
-A sentirsi chiamare Eccellenza il burattinaio fece subito il bocchino tondo, e diventato tutt’a un tratto più umano e più trattabile, disse a Pinocchio:
-– Ebbene, che cosa vuoi da me?
-– Vi domando grazia per il povero Arlecchino!...
-– Qui non c’è grazia che tenga. Se ho risparmiato te, bisogna che faccia mettere sul fuoco lui, perché io voglio che il mio montone sia arrostito bene.
-– In questo caso, – gridò fieramente Pinocchio, rizzandosi e gettando via il suo berretto di midolla di pane, – in questo caso conosco qual è il mio dovere. Avanti, signori giandarmi! Legatemi e gettatemi là fra quelle fiamme. No, non è giusta che il povero Arlecchino, il vero amico mio, debba morire per me!...
-Queste parole, pronunziate con voce alta e con accento eroico, fecero piangere tutti i burattini che erano presenti a quella scena. Gli stessi giandarmi, sebbene fossero di legno, piangevano come due agnellini di latte.
-Mangiafoco, sul principio, rimase duro e immobile come un pezzo di ghiaccio: ma poi, adagio adagio, cominciò anche lui a commuoversi e a starnutire. E fatti quattro o cinque starnuti, aprì affettuosamente le braccia e disse a Pinocchio:
-– Tu sei un gran bravo ragazzo! Vieni qua da me e dammi un bacio.
-Pinocchio corse subito, e arrampicandosi come uno scoiattolo su per la barba del burattinaio, andò a posargli un bellissimo bacio sulla punta del naso.
-– Dunque la grazia è fatta? – domandò il povero Arlecchino, con un fil di voce che si sentiva appena.
-– La grazia è fatta! – rispose Mangiafoco: poi soggiunse sospirando e tentennando il capo: – Pazienza! Per questa sera mi rassegnerò a mangiare il montone mezzo crudo, ma un’altra volta, guai a chi toccherà!...
-Alla notizia della grazia ottenuta, i burattini corsero tutti sul palcoscenico e, accesi i lumi e i lampadari come in serata di gala, cominciarono a saltare e a ballare. Era l’alba e ballavano sempre.
-
-XII Il burattinaio Mangiafoco regala cinque monete d’oro a Pinocchio, perché le porti al suo babbo Geppetto: e Pinocchio, invece, si lascia abbindolare dalla Volpe e dal Gatto e se ne va con loro.
-
-Il giorno dipoi Mangiafoco chiamò in disparte Pinocchio e gli domandò:
-– Come si chiama tuo padre?
-– Geppetto.
-– E che mestiere fa?
-– Il povero.
-– Guadagna molto?
-– Guadagna tanto, quanto ci vuole per non aver mai un centesimo in tasca. Si figuri che per comprarmi l’Abbecedario della scuola dové vendere l’unica casacca che aveva addosso: una casacca che, fra toppe e rimendi, era tutta una piaga.
-– Povero diavolo! Mi fa quasi compassione. Ecco qui cinque monete d’oro. Vai subito a portargliele e salutalo tanto da parte mia.
-Pinocchio, com’è facile immaginarselo, ringraziò mille volte il burattinaio, abbracciò, a uno a uno, tutti i burattini della Compagnia, anche i giandarmi: e fuori di sé dalla contentezza, si mise in viaggio per tornarsene a casa sua.
-Ma non aveva fatto ancora mezzo chilometro, che incontrò per la strada una Volpe zoppa da un piede e un Gatto cieco da tutt’e due gli occhi, che se ne andavano là là, aiutandosi fra di loro, da buoni compagni di sventura. La Volpe che era zoppa, camminava appoggiandosi al Gatto: e il Gatto, che era cieco, si lasciava guidare dalla Volpe.
-– Buon giorno, Pinocchio, – gli disse la Volpe, salutandolo garbatamente.
-– Com’è che sai il mio nome? – domandò il burattino.
-– Conosco bene il tuo babbo.
-– Dove l’hai veduto?
-– L’ho veduto ieri sulla porta di casa sua.
-– E che cosa faceva?
-– Era in maniche di camicia e tremava dal freddo.
-– Povero babbo! Ma, se Dio vuole, da oggi in poi non tremerà più!...
-– Perché?
-– Perché io sono diventato un gran signore.
-– Un gran signore tu? – disse la Volpe, e cominciò a ridere di un riso sguaiato e canzonatore: e il Gatto rideva anche lui, ma per non darlo a vedere, si pettinava i baffi colle zampe davanti.
-– C’è poco da ridere, – gridò Pinocchio impermalito. – Mi dispiace davvero di farvi venire l’acquolina in bocca, ma queste qui, se ve ne intendete, sono cinque bellissime monete d’oro.
-E tirò fuori le monete avute in regalo da Mangiafoco.
-Al simpatico suono di quelle monete la Volpe, per un moto involontario, allungò la gamba che pareva rattrappita, e il Gatto spalancò tutt’e due gli occhi, che parvero due lanterne verdi: ma poi li richiuse subito, tant’è vero che Pinocchio non si accorse di nulla.
-– E ora, – gli domandò la Volpe, – che cosa vuoi farne di codeste monete?
-– Prima di tutto, – rispose il burattino, – voglio comprare per il mio babbo una bella casacca nuova, tutta d’oro e d’argento e coi bottoni di brillanti: e poi voglio comprare un Abbecedario per me.
-– Per te?
-– Davvero: perché voglio andare a scuola e mettermi a studiare a buono.
-– Guarda me! – disse la Volpe. – Per la passione sciocca di studiare ho perduto una gamba.
-– Guarda me! – disse il Gatto. – Per la passione sciocca di studiare ho perduto la vista di tutti e due gli occhi.
-In quel mentre un Merlo bianco, che se ne stava appollaiato sulla siepe della strada, fece il solito verso e disse:
-– Pinocchio, non dar retta ai consigli dei cattivi compagni: se no, te ne pentirai!
-Povero Merlo, non l’avesse mai detto! Il Gatto, spiccando un gran salto, gli si avventò addosso, e senza dargli nemmeno il tempo di dire ohi se lo mangiò in un boccone, con le penne e tutto.
-Mangiato che l’ebbe e ripulitasi la bocca, chiuse gli occhi daccapo e ricominciò a fare il cieco, come prima.
-– Povero Merlo! – disse Pinocchio al Gatto, – perché l’hai trattato così male?
-– Ho fatto per dargli una lezione. Così un’altra volta imparerà a non metter bocca nei discorsi degli altri.
-Erano giunti più che a mezza strada, quando la Volpe, fermandosi di punto in bianco, disse al burattino:
-– Vuoi raddoppiare le tue monete d’oro?
-– Cioè?
-– Vuoi tu, di cinque miserabili zecchini, farne cento, mille, duemila?
-– Magari! E la maniera?
-– La maniera è facilissima. Invece di tornartene a casa tua, dovresti venire con noi.
-– E dove mi volete condurre?
-– Nel paese dei Barbagianni.
-Pinocchio ci pensò un poco, e poi disse risolutamente:
-– No, non ci voglio venire. Oramai sono vicino a casa, e voglio andarmene a casa, dove c’è il mio babbo che m’aspetta. Chi lo sa, povero vecchio, quanto ha sospirato ieri, a non vedermi tornare. Pur troppo io sono stato un figliolo cattivo, e il Grillo-parlante aveva ragione quando diceva: «I ragazzi disobbedienti non possono aver bene in questo mondo». E io l’ho provato a mie spese, Perché mi sono capitate dimolte disgrazie, e anche ieri sera in casa di Mangiafoco, ho corso pericolo... Brrr! mi viene i bordoni soltanto a pensarci!
-– Dunque, – disse la Volpe, – vuoi proprio andare a casa tua? Allora vai pure, e tanto peggio per te!
-– Tanto peggio per te! – ripeté il Gatto.
-– Pensaci bene, Pinocchio, perché tu dai un calcio alla fortuna.
-– Alla fortuna! – ripeté il Gatto.
-– I tuoi cinque zecchini, dall’oggi al domani sarebbero diventati duemila.
-– Duemila! – ripeté il Gatto.
-– Ma com’è mai possibile che diventino tanti? – domandò Pinocchio, restando a bocca aperta dallo stupore.
-– Te lo spiego subito, – disse la Volpe. – Bisogna sapere che nel paese dei Barbagianni c’è un campo benedetto, chiamato da tutti il Campo dei miracoli. Tu fai in questo campo una piccola buca e ci metti dentro per esempio uno zecchino d’oro. Poi ricuopri la buca con un po’ di terra: l’annaffi con due secchie d’acqua di fontana, ci getti sopra una presa di sale, e la sera te ne vai tranquillamente a letto. Intanto, durante la notte, lo zecchino germoglia e fiorisce, e la mattina dopo, di levata, ritornando nel campo, che cosa trovi? Trovi un bell’albero carico di tanti zecchini d’oro, quanti chicchi di grano può avere una bella spiga nel mese di giugno.
-– Sicché dunque, – disse Pinocchio sempre più sbalordito, – se io sotterrassi in quel campo i miei cinque zecchini, la mattina dopo quanti zecchini ci troverei?
-– È un conto facilissimo, – rispose la Volpe, – un conto che puoi farlo sulla punta delle dita. Poni che ogni zecchino ti faccia un grappolo di cinquecento zecchini: moltiplica il cinquecento per cinque e la mattina dopo ti trovi in tasca duemila cinquecento zecchini lampanti e sonanti.
-– Oh che bella cosa! – gridò Pinocchio, ballando dall’allegrezza. – Appena che questi zecchini gli avrò raccolti, ne prenderò per me duemila e gli altri cinquecento di più li darò in regalo a voi altri due.
-– Un regalo a noi? – gridò la Volpe sdegnandosi e chiamandosi offesa. – Dio te ne liberi!
-– Te ne liberi! – ripeté il Gatto.
-– Noi, – riprese la Volpe, – non lavoriamo per il vile interesse: noi lavoriamo unicamente per arricchire gli altri.
-– Gli altri! – ripeté il Gatto.
-– Che brave persone! – pensò dentro di sé Pinocchio: e dimenticandosi lì sul tamburo, del suo babbo, della casacca nuova, dell’Abbecedario e di tutti i buoni proponimenti fatti, disse alla Volpe e al Gatto:
-– Andiamo pure. Io vengo con voi.
-
-XIII L’osteria del Gambero Rosso.
-
-Cammina, cammina, cammina, alla fine sul far della sera arrivarono stanchi morti all’osteria del Gambero Rosso.
-– Fermiamoci un po’ qui, – disse la Volpe, – tanto per mangiare un boccone e per riposarci qualche ora. A mezzanotte poi ripartiremo per essere domani, all’alba, nel Campo dei miracoli.
-Entrati nell’osteria, si posero tutti e tre a tavola: ma nessuno di loro aveva appetito.
-Il povero Gatto, sentendosi gravemente indisposto di stomaco, non poté mangiare altro che trentacinque triglie con salsa di pomodoro e quattro porzioni di trippa alla parmigiana: e perché la trippa non gli pareva condita abbastanza, si rifece tre volte a chiedere il burro e il formaggio grattato!
-La Volpe avrebbe spelluzzicato volentieri qualche cosa anche lei: ma siccome il medico le aveva ordinato una grandissima dieta, così dové contentarsi di una semplice lepre dolce e forte con un leggerissimo contorno di pollastre ingrassate e di galletti di primo canto. Dopo la lepre si fece portare per tornagusto un cibreino di pernici, di starne, di conigli, di ranocchi, di lucertole e d’uva paradisa; e poi non volle altro. Aveva tanta nausea per il cibo, diceva lei, che non poteva accostarsi nulla alla bocca.
-Quello che mangiò meno di tutti fu Pinocchio. Chiese uno spicchio di noce e un cantuccino di pane, e lasciò nel piatto ogni cosa. Il povero figliuolo col pensiero sempre fisso al Campo dei miracoli, aveva preso un’indigestione anticipata di monete d’oro.
-Quand’ebbero cenato, la Volpe disse all’oste:
-– Dateci due buone camere, una per il signor Pinocchio e un’altra per me e per il mio compagno. Prima di ripartire schiacceremo un sonnellino. Ricordatevi però che a mezzanotte vogliamo essere svegliati per continuare il nostro viaggio.
-– Sissignori, – rispose l’oste e strizzò l’occhio alla Volpe e al Gatto, come dire: «Ho mangiata la foglia e ci siamo intesi!...».
-Appena che Pinocchio fu entrato nel letto, si addormentò a colpo e principiò a sognare. E sognando gli pareva di essere in mezzo a un campo, e questo campo era pieno di arboscelli carichi di grappoli, e questi grappoli erano carichi di zecchini d’oro che, dondolandosi mossi dal vento, facevano zin, zin, zin, quasi volessero dire: «Chi ci vuole venga a prenderci». Ma quando Pinocchio fu sul più bello, quando, cioè, allungò la mano per prendere a manciate tutte quelle belle monete e mettersele in tasca, si trovò svegliato all’improvviso da tre violentissimi colpi dati nella porta di camera.
-Era l’oste che veniva a dirgli che la mezzanotte era suonata.
-– E i miei compagni sono pronti? – gli domandò il burattino.
-– Altro che pronti! Sono partiti due ore fa.
-– Perché mai tanta fretta?
-– Perché il Gatto ha ricevuto un’imbasciata, che il suo gattino maggiore, malato di geloni ai piedi, stava in pericolo di vita.
-– E la cena l’hanno pagata?
-– Che vi pare? Quelle lì sono persone troppo educate perché facciano un affronto simile alla signoria vostra.
-– Peccato! Quest’affronto mi avrebbe fatto tanto piacere! – disse Pinocchio, grattandosi il capo. Poi domandò:
-– E dove hanno detto di aspettarmi quei buoni amici?
-– Al Campo dei miracoli, domattina, allo spuntare del giorno.
-Pinocchio pagò uno zecchino per la cena sua e per quella dei suoi compagni, e dopo partì.
-Ma si può dire che partisse a tastoni, perché fuori dell’osteria c’era un buio così buio, che non ci si vedeva da qui a lì. Nella campagna all’intorno non si sentiva alitare una foglia. Solamente alcuni uccellacci notturni, traversando la strada da una siepe all’altra, venivano a sbattere le ali sul naso di Pinocchio, il quale, facendo un salto indietro per la paura, gridava: – Chi va là? – e l’eco delle colline circostanti ripeteva in lontananza: – Chi va là? chi va là? chi va là?
-Intanto, mentre camminava, vide sul tronco di un albero un piccolo animaletto che riluceva di una luce pallida e opaca, come un lumino da notte dentro una lampada di porcellana trasparente.
-– Chi sei? – gli domandò Pinocchio.
-– Sono l’ombra del Grillo-parlante, – rispose l’animaletto, con una vocina fioca fioca, che pareva venisse dal mondo di là.
-– Che vuoi da me? – disse il burattino.
-– Voglio darti un consiglio. Ritorna indietro e porta i quattro zecchini, che ti sono rimasti, al tuo povero babbo che piange e si dispera per non averti più veduto.
-– Domani il mio babbo sarà un gran signore, perché questi quattro zecchini diventeranno duemila.
-– Non ti fidare, ragazzo mio, di quelli che promettono di farti ricco dalla mattina alla sera. Per il solito, o sono matti o imbroglioni! Dai retta a me, ritorna indietro.
-– E io, invece, voglio andare avanti.
-– L’ora è tarda!...
-– Voglio andare avanti.
-– La nottata è scura...
-– Voglio andare avanti.
-– La strada è pericolosa...
-– Voglio andare avanti.
-– Ricordati che i ragazzi che vogliono fare di loro capriccio e a modo loro, prima o poi se ne pentono.
-– Le solite storie. Buona notte, Grillo.
-– Buona notte, Pinocchio, e che il cielo ti salvi dalla guazza e dagli assassini!
-Appena dette queste ultime parole, il Grillo-parlante si spense a un tratto, come si spenge un lume soffiandoci sopra, e la strada rimase più buia di prima.
-
-XIV Pinocchio, per non aver dato retta ai buoni consigli del Grillo-parlante, s’imbatte negli assassini.
-
-– Davvero, – disse fra sé il burattino rimettendosi in viaggio, – come siamo disgraziati noialtri poveri ragazzi! Tutti ci sgridano, tutti ci ammoniscono, tutti ci danno consigli. A lasciarli dire, tutti si metterebbero in capo di essere i nostri babbi e i nostri maestri; tutti: anche i Grilli-parlanti. Ecco qui: perché io non ho voluto dar retta a quell’uggioso di Grillo, chi lo sa quante disgrazie, secondo lui, mi dovrebbero accadere! Dovrei incontrare anche gli assassini! Meno male che agli assassini io non ci credo, né ci ho creduto mai. Per me gli assassini sono stati inventati apposta dai babbi, per far paura ai ragazzi che vogliono andare fuori la notte. E poi se anche li trovassi qui sulla strada, mi darebbero forse soggezione? Neanche per sogno. Anderei loro sul viso, gridando: «Signori assassini, che cosa vogliono da me? Si rammentino che con me non si scherza! Se ne vadano dunque per i fatti loro, e zitti!». A questa parlantina fatta sul serio, quei poveri assassini, mi par di vederli, scapperebbero via come il vento. Caso poi fossero tanto ineducati da non voler scappare, allora scapperei io, e così la farei finita...
-Ma Pinocchio non poté finire il suo ragionamento, perché in quel punto gli parve di sentire dietro di sé un leggerissimo fruscio di foglie.
-Si voltò a guardare e vide nel buio due figuracce nere tutte imbacuccate in due sacchi da carbone, le quali correvano dietro a lui a salti e in punta di piedi, come se fossero due fantasmi.
-– Eccoli davvero! – disse dentro di sé: e non sapendo dove nascondere i quattro zecchini, se li nascose in bocca e precisamente sotto la lingua.
-Poi si provò a scappare. Ma non aveva ancor fatto il primo passo, che sentì agguantarsi per le braccia e intese due voci orribili e cavernose, che gli dissero:
-– O la borsa o la vita!
-Pinocchio non potendo rispondere con le parole, a motivo delle monete che aveva in bocca, fece mille salamelecchi e mille pantomime per dare ad intendere a quei due incappati, di cui si vedevano soltanto gli occhi attraverso i buchi dei sacchi, che lui era un povero burattino, e che non aveva in tasca nemmeno un centesimo falso.
-– Via, via! Meno ciarle e fuori i denari! – gridavano minacciosamente i due briganti.
-E il burattino fece col capo e colle mani un segno come dire: «Non ne ho».
-– Metti fuori i denari o sei morto, - disse l’assassino più alto di statura.
-- Morto! - ripeté l’altro.
-– E dopo ammazzato te, ammazzeremo anche tuo padre!
-– Anche tuo padre!
-– No, no, no, il mio povero babbo no! – gridò Pinocchio con accento disperato: ma nel gridare così, gli zecchini gli suonarono in bocca.
-– Ah! furfante! Dunque i denari te li sei nascosti sotto la lingua? Sputali subito!
-E Pinocchio, duro!
-– Ah! tu fai il sordo? Aspetta un poco, che penseremo noi a farteli sputare!
-Difatti, uno di loro afferrò il burattino per la punta del naso e quell’altro lo prese per la bazza, e lì cominciarono a tirare screanzatamente, uno per in qua e l’altro per in là, tanto da costringerlo a spalancare la bocca: ma non ci fu verso. La bocca del burattino pareva inchiodata e ribadita.
-Allora l’assassino più piccolo di statura, cavato fuori un coltellaccio, provò a conficcarglielo, a guisa di leva e di scalpello, fra le labbra: ma Pinocchio, lesto come un lampo, gli azzannò la mano coi denti, e dopo avergliela con un morso staccata di netto, la sputò; e figuratevi la sua maraviglia quando, invece di una mano, si accorse di aver sputato in terra uno zampetto di gatto.
-Incoraggiato da questa prima vittoria, si liberò a forza dalle unghie degli assassini e, saltata la siepe della strada, cominciò a fuggire per la campagna. E gli assassini a correre dietro a lui, come due cani dietro una lepre: e quello che aveva perduto uno zampetto correva con una gamba sola, né si è saputo mai come facesse.
-Dopo una corsa di quindici chilometri, Pinocchio non ne poteva più. Allora, vistosi perso, si arrampicò su per il fusto di un altissimo pino e si pose a sedere in vetta ai rami. Gli assassini tentarono di arrampicarsi anche loro, ma giunti a metà del fusto sdrucciolarono e, ricascando a terra, si spellarono le mani e i piedi.
-Non per questo si dettero per vinti: che anzi, raccolto un fastello di legna secche a piè del pino, vi appiccarono il fuoco. In men che non si dice, il pino cominciò a bruciare e a divampare, come una candela agitata dal vento. Pinocchio, vedendo che le fiamme salivano sempre più, e non volendo far la fine del piccione arrosto, spiccò un bel salto di vetta all’albero, e via a correre daccapo attraverso ai campi e ai vigneti. E gli assassini dietro, sempre dietro, senza stancarsi mai.
-Intanto cominciava a baluginare il giorno e si rincorrevano sempre; quand’ecco che Pinocchio si trovò sbarrato il passo da un fosso largo e profondissimo, tutto pieno di acquaccia sudicia, color del caffè e latte. Che fare? «Una, due, tre!» gridò il burattino, e slanciandosi con una gran rincorsa, saltò dall’altra parte. E gli assassini saltarono anche loro, ma non avendo preso bene la misura, patatunfete!... cascarono giù nel bel mezzo del fosso. Pinocchio che sentì il tonfo e gli schizzi dell’acqua, urlò ridendo e seguitando a correre:
-– Buon bagno, signori assassini.
-E già si figurava che fossero bell’e affogati, quando invece, voltandosi a guardare, si accòrse che gli correvano dietro tutti e due, sempre imbacuccati nei loro sacchi e grondanti acqua come due panieri sfondati.
-
-XV Gli assassini inseguono Pinocchio; e, dopo averlo raggiunto, lo impiccano a un ramo della Quercia grande.
-
-Allora il burattino, perdutosi d’animo, fu proprio sul punto di gettarsi in terra e di darsi per vinto, quando nel girare gli occhi all’intorno vide fra mezzo al verde cupo degli alberi biancheggiare in lontananza una casina candida come la neve.
-– Se io avessi tanto fiato da arrivare fino a quella casa, forse sarei salvo, – disse dentro di sé.
-E senza indugiare un minuto riprese a correre per il bosco a carriera distesa. E gli assassini sempre dietro.
-E dopo una corsa disperata di quasi due ore, finalmente tutto trafelato arrivò alla porta di quella casina e bussò.
-Nessuno rispose.
-Tornò a bussare con maggior violenza, perché sentiva avvicinarsi il rumore dei passi e il respiro grosso e affannoso de’ suoi persecutori.
-Lo stesso silenzio.
-Avvedutosi che il bussare non giovava a nulla, cominciò per disperazione a dare calci e zuccate nella porta. Allora si affacciò alla finestra una bella bambina, coi capelli turchini e il viso bianco come un’immagine di cera, gli occhi chiusi e le mani incrociate sul petto, la quale senza muovere punto le labbra, disse con una vocina che pareva venisse dall’altro mondo:
-– In questa casa non c’è nessuno. Sono tutti morti.
-– Aprimi almeno tu! – gridò Pinocchio piangendo e raccomandandosi.
-– Sono morta anch’io.
-– Morta? e allora che cosa fai costì alla finestra?
-– Aspetto la bara che venga a portarmi via.
-Appena detto così, la bambina disparve, e la finestra si richiuse senza far rumore.
-– O bella bambina dai capelli turchini, – gridava Pinocchio, – aprimi per carità! Abbi compassione di un povero ragazzo inseguito dagli assass...
-Ma non poté finir la parola, perché sentì afferrarsi per il collo, e le solite due vociaccie che gli brontolarono minacciosamente:
-– Ora non ci scappi più!
-Il burattino, vedendosi balenare la morte dinanzi agli occhi, fu preso da un tremito così forte, che nel tremare, gli sonavano le giunture delle sue gambe di legno e i quattro zecchini che teneva nascosti sotto la lingua.
-– Dunque? – gli domandarono gli assassini, – vuoi aprirla la bocca, sì o no? Ah! non rispondi?... Lascia fare: ché questa volta te la faremo aprir noi!...
-E cavato fuori due coltellacci lunghi lunghi e affilati come rasoi, zaff... gli affibbiarono due colpi nel mezzo alle reni.
-Ma il burattino per sua fortuna era fatto d’un legno durissimo, motivo per cui le lame, spezzandosi, andarono in mille schegge e gli assassini rimasero col manico dei coltelli in mano, a guardarsi in faccia.
-– Ho capito, – disse allora uno di loro, – bisogna impiccarlo! Impicchiamolo!
-– Impicchiamolo, – ripeté l’altro.
-Detto fatto, gli legarono le mani dietro le spalle e passatogli un nodo scorsoio intorno alla gola, lo attaccarono penzoloni al ramo di una grossa pianta detta la Quercia grande.
-Poi si posero là, seduti sull’erba, aspettando che il burattino facesse l’ultimo sgambetto: ma il burattino, dopo tre ore, aveva sempre gli occhi aperti, la bocca chiusa e sgambettava più che mai.
-Annoiati finalmente di aspettare, si voltarono a Pinocchio e gli dissero sghignazzando:
-– Addio a domani. Quando domani torneremo qui, si spera che ci farai la garbatezza di farti trovare bell’e morto e con la bocca spalancata.
-E se ne andarono.
-Intanto s’era levato un vento impetuoso di tramontana, che soffiando e mugghiando con rabbia, sbatacchiava in qua e in là il povero impiccato, facendolo dondolare violentemente come il battaglio di una campana che suona a festa. E quel dondolìo gli cagionava acutissimi spasimi, e il nodo scorsoio, stringendosi sempre più alla gola, gli toglieva il respiro.
-A poco a poco gli occhi gli si appannavano; e sebbene sentisse avvicinarsi la morte, pure sperava sempre che da un momento all’altro sarebbe capitata qualche anima pietosa a dargli aiuto. Ma quando, aspetta aspetta, vide che non compariva nessuno, proprio nessuno, allora gli tornò in mente il suo povero babbo... e balbettò quasi moribondo:
-– Oh babbo mio! se tu fossi qui!...
-E non ebbe fiato per dir altro. Chiuse gli occhi, aprì la bocca, stirò le gambe e, dato un grande scrollone, rimase lì come intirizzito.
-
-XVI La bella Bambina dai capelli turchini fa raccogliere il burattino: lo mette a letto, e chiama tre medici per sapere se sia vivo o morto.
-
-In quel mentre che il povero Pinocchio impiccato dagli assassini a un ramo della Quercia grande, pareva oramai più morto che vivo, la bella Bambina dai capelli turchini si affacciò daccapo alla finestra, e impietositasi alla vista di quell’infelice che, sospeso per il collo, ballava il trescone alle ventate di tramontana, batté per tre volte le mani insieme, e fece tre piccoli colpi.
-A questo segnale si sentì un gran rumore di ali che volavano con foga precipitosa, e un grosso falco venne a posarsi sul davanzale della finestra.
-– Che cosa comandate, mia graziosa Fata? – disse il Falco abbassando il becco in atto di reverenza (perché bisogna sapere che la Bambina dai capelli turchini non era altro, in fin dei conti, che una buonissima Fata, che da più di mill’anni abitava nelle vicinanze di quel bosco):
-– Vedi tu quel burattino attaccato penzoloni a un ramo della Quercia grande?
-– Lo vedo.
-– Orbene: vola subito laggiù: rompi col tuo fortissimo becco il nodo che lo tiene sospeso in aria e posalo delicatamente sdraiato sull’erba a piè della Quercia.
-Il Falco volò via e dopo due minuti tornò dicendo:
-– Quel che mi avete comandato, è fatto.
-– E come l’hai trovato? Vivo o morto?
-– A vederlo, pareva morto, ma non dev’essere ancora morto perbene, perché, appena gli ho sciolto il nodo scorsoio che lo stringeva intorno alla gola, ha lasciato andare un sospiro, balbettando a mezza voce: «Ora mi sento meglio!».
-Allora la Fata, battendo le mani insieme, fece due piccoli colpi, e apparve un magnifico Can-barbone, che camminava ritto sulle gambe di dietro, tale e quale come se fosse un uomo.
-Il Can-barbone era vestito da cocchiere in livrea di gala. Aveva in capo un nicchiettino a tre punte gallonato d’oro, una parrucca bianca coi riccioli che gli scendevano giù per il collo, una giubba color di cioccolata coi bottoni di brillanti e con due grandi tasche per tenervi gli ossi che gli regalava a pranzo la padrona, un paio di calzoni corti di velluto cremisi, le calze di seta, gli scarpini scollati, e di dietro una specie di fodera da ombrelli, tutta di raso turchino, per mettervi dentro la coda, quando il tempo cominciava a piovere.
-– Su da bravo, Medoro! – disse la Fata al Can-barbone; – Fai subito attaccare la più bella carrozza della mia scuderia e prendi la via del bosco. Arrivato che sarai sotto la Quercia grande, troverai disteso sull’erba un povero burattino mezzo morto. Raccoglilo con garbo, posalo pari pari su i cuscini della carrozza e portamelo qui. Hai capito?
-Il Can-barbone, per fare intendere che aveva capito, dimenò tre o quattro volte la fodera di raso turchino, che aveva dietro, e partì come un barbero.
-Di lì a poco, si vide uscire dalla scuderia una bella carrozzina color dell’aria, tutta imbottita di penne di canarino e foderata nell’interno di panna montata e di crema coi savoiardi. La carrozzina era tirata da cento pariglie di topini bianchi, e il Can-barbone, seduto a cassetta, schioccava la frusta a destra e a sinistra, come un vetturino quand’ha paura di aver fatto tardi.
-Non era ancora passato un quarto d’ora, che la carrozzina tornò, e la Fata, che stava aspettando sull’uscio di casa, prese in collo il povero burattino, e portatolo in una cameretta che aveva le pareti di madreperla, mandò subito a chiamare i medici più famosi del vicinato.
-E i medici arrivarono subito, uno dopo l’altro: arrivò, cioè, un Corvo, una Civetta e un Grillo-parlante.
-– Vorrei sapere da lor signori, – disse la Fata, rivolgendosi ai tre medici riuniti intorno al letto di Pinocchio, – vorrei sapere da lor signori se questo disgraziato burattino sia morto o vivo!...
-A quest’invito, il Corvo, facendosi avanti per il primo, tastò il polso a Pinocchio: poi gli tastò il naso, poi il dito mignolo dei piedi: e quand’ebbe tastato ben bene, pronunziò solennemente queste parole:
-– A mio credere il burattino è bell’e morto: ma se per disgrazia non fosse morto, allora sarebbe indizio sicuro che è sempre vivo!
-– Mi dispiace, – disse la Civetta, – di dover contraddire il Corvo, mio illustre amico e collega: per me, invece, il burattino è sempre vivo; ma se per disgrazia non fosse vivo, allora sarebbe segno che è morto davvero!
-– E lei non dice nulla? – domandò la Fata al Grillo-parlante.
-– Io dico che il medico prudente quando non sa quello che dice, la miglior cosa che possa fare, è quella di stare zitto. Del resto quel burattino lì non m’è fisonomia nuova: io lo conosco da un pezzo!...
-Pinocchio, che fin allora era stato immobile come un vero pezzo di legno, ebbe una specie di fremito convulso, che fece scuotere tutto il letto.
-– Quel burattino lì, – seguitò a dire il Grillo-parlante, – è una birba matricolata...
-Pinocchio aprì gli occhi e li richiuse subito.
-– È un monellaccio, uno svogliato, un vagabondo. Pinocchio si nascose la faccia sotto i lenzuoli.
-– Quel burattino lì è un figliuolo disubbidiente, che farà morire di crepacuore il suo povero babbo!...
-A questo punto si sentì nella camera un suono soffocato di pianti e di singhiozzi. Figuratevi come rimasero tutti, allorché sollevati un poco i lenzuoli, si accorsero che quello che piangeva e singhiozzava era Pinocchio.
-– Quando il morto piange, è segno che è in via di guarigione, – disse solennemente il Corvo.
-– Mi duole di contraddire il mio illustre amico e collega, – soggiunse la Civetta, – ma per me, quando il morto piange è segno che gli dispiace a morire.
-
-XVII Pinocchio mangia lo zucchero, ma non vuol purgarsi: Però quando vede i becchini che vengono a portarlo via, allora si purga. Poi dice una bugia e per gastigo gli cresce il naso.
-
-Appena i tre medici furono usciti di camera, la Fata si accostò a Pinocchio e, dopo averlo toccato sulla fronte, si accòrse che era travagliato da un febbrone da non si dire.
-Allora sciolse una certa polverina bianca in un mezzo bicchier d’acqua, e porgendolo al burattino, gli disse amorosamente:
-– Bevila, e in pochi giorni sarai guarito.
-Pinocchio guardò il bicchiere, storse un po’ la bocca, e poi dimanda con voce di piagnisteo:
-– È dolce o amara?
-– È amara, ma ti farà bene.
-– Se è amara, non la voglio.
-– Da’ retta a me: bevila.
-– A me l’amaro non mi piace.
-– Bevila: e quando l’avrai bevuta, ti darò una pallina di zucchero, per rifarti la bocca.
-– Dov’è la pallina di zucchero?
-– Eccola qui, – disse la Fata, tirandola fuori da una zuccheriera d’oro.
-– Prima voglio la pallina di zucchero, e poi beverò quell’acquaccia amara...
-– Me lo prometti?
-– Sì...
-La fata gli dette la pallina, e Pinocchio, dopo averla sgranocchiata e ingoiata in un attimo, disse leccandosi i labbri:
-– Bella cosa se anche lo zucchero fosse una medicina!... Mi purgherei tutti i giorni.
-– Ora mantieni la promessa e bevi queste poche gocciole d’acqua, che ti renderanno la salute.
-Pinocchio prese di mala voglia il bicchiere in mano e vi ficcò dentro la punta del naso: poi se l’accostò alla bocca: poi tornò a ficcarci la punta del naso: finalmente disse:
-– È troppo amara! troppo amara! Io non la posso bere.
-– Come fai a dirlo se non l’hai nemmeno assaggiata?
-– Me lo figuro! L’ho sentita all’odore. Voglio prima un’altra pallina di zucchero... e poi la beverò!...
-Allora la Fata, con tutta la pazienza di una buona mamma, gli pose in bocca un altro po’ di zucchero; e dopo gli presentò daccapo il bicchiere.
-– Così non la posso bere! – disse il burattino, facendo mille smorfie.
-– Perché?
-– Perché mi dà noia quel guanciale che ho laggiù sui piedi.
-La Fata gli levò il guanciale.
-– È inutile! Nemmeno così la posso bere...
-– Che cos’altro ti dà noia?
-– Mi dà noia l’uscio di camera, che è mezzo aperto.
-La Fata andò e chiuse l’uscio di camera.
-– Insomma, – gridò Pinocchio, dando in uno scoppio di pianto, – quest’acquaccia amara, non la voglio bere, no, no, no!...
-– Ragazzo mio, te ne pentirai...
-– Non me n’importa...
-– La tua malattia è grave...
-– Non me n’importa...
-– La febbre ti porterà in poche ore all’altro mondo...
-– Non me n’importa...
-– Non hai paura della morte?
-– Punto paura!... Piuttosto morire, che bevere quella medicina cattiva.
-A questo punto, la porta della camera si spalancò ed entrarono dentro quattro conigli neri come l’inchiostro, che portavano sulle spalle una piccola bara da morto.
-– Che cosa volete da me? – gridò Pinocchio, rizzandosi tutto impaurito a sedere sul letto.
-– Siamo venuti a prenderti, – rispose il coniglio più grosso.
-– A prendermi?... Ma io non sono ancora morto!...
-– Ancora no: ma ti restano pochi minuti di vita avendo tu ricusato di bevere la medicina, che ti avrebbe guarito dalla febbre!...
-– O Fata, o Fata mia,– cominciò allora a strillare il burattino, – datemi subito quel bicchiere. Spicciatevi, per carità, perché non voglio morire no... non voglio morire...
-E preso il bicchiere con tutt’e due le mani, lo votò in un fiato.
-– Pazienza! – dissero i conigli. – Per questa volta abbiamo fatto il viaggio a ufo.
-E tiratisi di nuovo la piccola bara sulle spalle, uscirono di camera bofonchiando e mormorando fra i denti.
-Fatto sta che di lì a pochi minuti, Pinocchio saltò giù dal letto, bell’e guarito; perché bisogna sapere che i burattini di legno hanno il privilegio di ammalarsi di rado e di guarire prestissimo.
-E la Fata, vedendolo correre e ruzzare per la camera, vispo e allegro come un gallettino di primo canto, gli disse:
-– Dunque la mia medicina t’ha fatto bene davvero?
-– Altro che bene! Mi ha rimesso al mondo!...
-– E allora come mai ti sei fatto tanto pregare a beverla?
-– Egli è che noi ragazzi siamo tutti così! Abbiamo più paura delle medicine che del male.
-– Vergogna! I ragazzi dovrebbero sapere che un buon medicamento preso a tempo può salvarli da una grave malattia e fors’anche dalla morte...
-– Oh! ma un’altra volta non mi farò tanto pregare! Mi rammenterò di quei conigli neri, colla bara sulle spalle... e allora piglierò subito il bicchiere in mano, e giù!...
-– Ora vieni un po’ qui da me e raccontami come andò che ti trovasti fra le mani degli assassini.
-– Gli andò che il burattinaio Mangiafoco mi dette alcune monete d’oro, e mi disse: «To’, portale al tuo babbo!» e io, invece, per la strada trovai una Volpe e un Gatto, due persone molto per bene, che mi dissero: «Vuoi che codeste monete diventino mille e duemila? Vieni con noi, e ti condurremo al Campo dei Miracoli». E io dissi: «Andiamo»; e loro dissero: «Fermiamoci qui all’osteria del Gambero Rosso e dopo la mezzanotte ripartiremo». Ed io, quando mi svegliai, loro non c’erano più, perché erano partiti. Allora io cominciai a camminare di notte, che era un buio che pareva impossibile, per cui trovai per la strada due assassini dentro due sacchi da carbone, che mi dissero: «Metti fuori i quattrini»; e io dissi: «Non ce n’ho»; perché le quattro monete d’oro me l’ero nascoste in bocca, e uno degli assassini si provò a mettermi le mani in bocca, e io con un morso gli staccai la mano e poi la sputai, ma invece di una mano sputai uno zampetto di gatto. E gli assassini a corrermi dietro e, io corri che ti corro, finché mi raggiunsero, e mi legarono per il collo a un albero di questo bosco, col dire: «Domani torneremo qui, e allora sarai morto e colla bocca aperta, e così ti porteremo via le monete d’oro che hai nascoste sotto la lingua».
-– E ora le quattro monete dove le hai messe? – gli domandò la Fata.
-– Le ho perdute! – rispose Pinocchio; ma disse una bugia, perché invece le aveva in tasca. Appena detta la bugia, il suo naso, che era già lungo, gli crebbe subito due dita di più.
-– E dove le hai perdute?
-– Nel bosco qui vicino.
-A questa seconda bugia il naso seguitò a crescere.
-– Se le hai perdute nel bosco vicino, – disse la Fata, – le cercheremo e le ritroveremo: perché tutto quello che si perde nel vicino bosco, si ritrova sempre.
-– Ah! ora che mi rammento bene, – replicò il burattino, imbrogliandosi, – le quattro monete non le ho perdute, ma senza avvedermene le ho inghiottite mentre bevevo la vostra medicina.
-A questa terza bugia, il naso gli si allungò in un modo così straordinario, che il povero Pinocchio non poteva più girarsi da nessuna parte. Se si voltava di qui batteva il naso nel letto o nei vetri della finestra, se si voltava di là, lo batteva nelle pareti o nella porta di camera, se alzava un po’ di più il capo, correva il rischio di ficcarlo in un occhio alla Fata.
-E la Fata lo guardava e rideva.
-– Perché ridete? – gli domandò il burattino, tutto confuso e impensierito di quel suo naso che cresceva a occhiate.
-– Rido della bugia che hai detto.
-– Come mai sapete che ho detto una bugia?
-– Le bugie, ragazzo mio, si riconoscono subito! perché ve ne sono di due specie: vi sono le bugie che hanno le gambe corte, e le bugie che hanno il naso lungo: la tua per l’appunto è di quelle che hanno il naso lungo.
-Pinocchio, non sapendo più dove nascondersi per la vergogna, si provò a fuggire di camera; ma non gli riuscì. Il suo naso era cresciuto tanto, che non passava più dalla porta.
-
-XVIII Pinocchio ritrova la Volpe e il Gatto, e va con loro a seminare le quattro monete nel Campo de’ Miracoli.
-
-Come potete immaginarvelo, la Fata lasciò che il burattino piangesse e urlasse una buona mezz’ora, a motivo di quel suo naso che non passava più dalla porta di camera; e lo fece per dargli una severa lezione perché si correggesse dal brutto vizio di dire le bugie, il più brutto vizio che possa avere un ragazzo. Ma quando lo vide trasfigurato e cogli occhi fuori della testa dalla gran disperazione, allora, mossa a pietà, batté le mani insieme, e a quel segnale entrarono in camera dalla finestra un migliaio di grossi uccelli chiamati Picchi, i quali, posatisi tutti sul naso di Pinocchio, cominciarono a beccarglielo tanto e poi tanto, che in pochi minuti quel naso enorme e spropositato si trovò ridotto alla sua grandezza naturale.
-– Quanto siete buona, Fata mia, – disse il burattino, asciugandosi gli occhi, – e quanto bene vi voglio!
-– Ti voglio bene anch’io, – rispose la Fata, – e se tu vuoi rimanere con me, tu sarai il mio fratellino e io la tua buona sorellina...
-– Io resterei volentieri... ma il mio povero babbo?
-– Ho pensato a tutto. Il tuo babbo è stato digià avvertito: e prima che faccia notte, sarà qui.
-– Davvero?... – gridò Pinocchio, saltando dall’allegrezza. – Allora, Fatina mia, se vi contentate, vorrei andargli incontro! Non vedo l’ora di poter dare un bacio a quel povero vecchio, che ha sofferto tanto per me!
-– Vai pure, ma bada di non ti sperdere. Prendi la via del bosco, e sono sicurissima che lo incontrerai.
-Pinocchio partì: e appena entrato nel bosco, cominciò a correre come un capriolo. Ma quando fu arrivato a un certo punto, quasi in faccia alla Quercia grande, si fermò, perché gli parve di aver sentito gente fra mezzo alle frasche. Difatti vide apparire sulla strada, indovinate chi?... la Volpe e il Gatto, ossia i due compagni di viaggio, coi quali aveva cenato all’osteria del Gambero Rosso.
-– Ecco il nostro caro Pinocchio! – gridò la Volpe, abbracciandolo e baciandolo. – Come mai sei qui?
-– Come mai sei qui? – ripeté il Gatto.
-– È una storia lunga, – disse il burattino, – e ve la racconterò a comodo. Sappiate però che l’altra notte, quando mi avete lasciato solo nell’osteria, ho trovato gli assassini per la strada...
-– Gli assassini?... O povero amico! E che cosa volevano?
-– Mi volevano rubare le monete d’oro.
-– Infami!... – disse la Volpe.
-– Infamissimi! – ripeté il Gatto.
-– Ma io cominciai a scappare, – continuò a dire il burattino, – e loro sempre dietro: finché mi raggiunsero e m’impiccarono a un ramo di quella quercia.
-E Pinocchio accennò la Quercia grande, che era lì a due passi.
-– Si può sentir di peggio? – disse la Volpe. – In che mondo siamo condannati a vivere? Dove troveremo un rifugio sicuro noi altri galantuomini?...
-Nel tempo che parlavano così, Pinocchio si accorse che il Gatto era zoppo dalla gamba destra davanti, perché gli mancava in fondo tutto lo zampetto cogli unghioli: per cui gli domandò:
-– Che cosa hai fatto del tuo zampetto?
-Il Gatto voleva rispondere qualche cosa, ma s’imbrogliò. Allora la Volpe disse subito:
-– Il mio amico è troppo modesto, – e per questo non risponde. Risponderò io per lui. Sappi dunque che un’ora fa abbiamo incontrato sulla strada un vecchio lupo, quasi svenuto dalla fame, che ci ha chiesto un po’ d’elemosina. Non avendo noi da dargli nemmeno una lisca di pesce, che cosa ha fatto l’amico mio, che ha davvero un cuore di Cesare?... Si è staccato coi denti uno zampetto delle sue gambe davanti e l’ha gettato a quella povera bestia, perché potesse sdigiunarsi.
-E la Volpe nel dir così, si asciugò una lacrima.
-Pinocchio, commosso anche lui, si avvicinò al Gatto, sussurrandogli negli orecchi:
-– Se tutti i gatti ti somigliassero, fortunati i topi!...
-– E ora che cosa fai in questi luoghi? – domandò la Volpe al burattino.
-– Aspetto il mio babbo, che deve arrivare qui di momento in momento.
-– E le tue monete d’oro?
-– Le ho sempre in tasca, meno una che la spesi all’osteria del Gambero Rosso.
-– E pensare che, invece di quattro monete, potrebbero diventare domani mille e duemila! Perché non dai retta al mio consiglio? Perché non vai a seminarle nel Campo dei miracoli?
-– Oggi è impossibile: vi anderò un altro giorno.
-– Un altro giorno sarà tardi, – disse la Volpe.
-– Perché?
-– Perché quel campo è stato comprato da un gran signore e da domani in là non sarà più permesso a nessuno di seminarvi i denari.
-– Quant’è distante di qui il Campo dei miracoli?
-– Due chilometri appena. Vuoi venire con noi? Fra mezz’ora sei là: semini subito le quattro monete: dopo pochi minuti ne raccogli duemila e stasera ritorni qui colle tasche piene. Vuoi venire con noi?
-Pinocchio esitò un poco a rispondere, perché gli tornò in mente la buona Fata, il vecchio Geppetto e gli avvertimenti del Grillo-parlante; ma poi finì col fare come fanno tutti i ragazzi senza un fil di giudizio e senza cuore; finì, cioè, col dare una scrollatina di capo, e disse alla Volpe e al Gatto:
-– Andiamo pure: io vengo con voi.
-E partirono.
-Dopo aver camminato una mezza giornata arrivarono a una città che aveva nome «Acchiappa-citrulli». Appena entrato in città, Pinocchio vide tutte le strade popolate di cani spelacchiati, che sbadigliavano dall’appetito, di pecore tosate che tremavano dal freddo, di galline rimaste senza cresta e senza bargigli, che chiedevano l’elemosina d’un chicco di granturco, di grosse farfalle, che non potevano più volare, perché avevano venduto le loro bellissime ali colorite, di pavoni tutti scodati, che si vergognavano a farsi vedere, e di fagiani che zampettavano cheti cheti, rimpiangendo le loro scintillanti penne d’oro e d’argento, oramai perdute per sempre.
-In mezzo a questa folla di accattoni e di poveri vergognosi passavano di tanto in tanto alcune carrozze signorili con dentro o qualche volpe, o qualche gazza ladra o qualche uccellaccio di rapina.
-– E il Campo dei miracoli dov’è? – domandò Pinocchio.
-– È qui a due passi.
-Detto fatto traversarono la città e, usciti fuori dalle mura, si fermarono in un campo solitario che, su per giù, somigliava a tutti gli altri campi.
-– Eccoci giunti, – disse la Volpe al burattino. – Ora chinati giù a terra, scava con le mani una piccola buca nel campo e mettici dentro le monete d’oro.
-Pinocchio ubbidì. Scavò la buca, ci pose le quattro monete d’oro che gli erano rimaste: e dopo ricoprì la buca con un po’ di terra.
-– Ora poi, – disse la Volpe, – vai alla gora qui vicina, prendi una secchia d’acqua e annaffia il terreno dove hai seminato.
-Pinocchio andò alla gora, e perché non aveva lì per lì una secchia, si levò di piedi una ciabatta e, riempitala d’acqua, annaffiò la terra che copriva la buca. Poi domandò:
-– C’è altro da fare?
-– Nient’altro, – rispose la Volpe. – Ora possiamo andar via. Tu poi ritorna qui fra una ventina di minuti e troverai l’arboscello già spuntato dal suolo e coi rami tutti carichi di monete.
-Il povero burattino, fuori di sé dalla contentezza, ringraziò mille volte la Volpe e il Gatto, e promise loro un bellissimo regalo.
-– Noi non vogliamo regali, – risposero quei due malanni. – A noi ci basta di averti insegnato il modo di arricchire senza durar fatica, e siamo contenti come pasque.
-Ciò detto salutarono Pinocchio, e augurandogli una buona raccolta, se ne andarono per i fatti loro.
-
-XIX Pinocchio è derubato delle sue monete d’oro e, per gastigo, si busca quattro mesi di prigione.
-
-Il burattino, ritornato in città, cominciò a contare i minuti a uno a uno; e, quando gli parve che fosse l’ora, riprese subito la strada che menava al Campo dei miracoli.
-E mentre camminava con passo frettoloso, il cuore gli batteva forte e gli faceva tic, tac, tic, tac, come un orologio da sala, quando corre davvero. E intanto pensava dentro di sé:
-– E se invece di mille monete, ne trovassi su i rami dell’albero duemila?... E se invece di duemila, ne trovassi cinquemila?... E se invece di cinquemila ne trovassi centomila? Oh che bel signore, allora, che diventerei!... Vorrei avere un bel palazzo, mille cavallini di legno e mille scuderie, per potermi baloccare, una cantina di rosoli e di alchermes, e una libreria tutta piena di canditi, di torte, di panettoni, di mandorlati e di cialdoni colla panna.
-Così fantasticando, giunse in vicinanza del campo, e lì si fermò a guardare se per caso avesse potuto scorgere qualche albero coi rami carichi di monete: ma non vide nulla. Fece altri cento passi in avanti, e nulla: entrò sul campo... andò proprio su quella piccola buca, dove aveva sotterrato i suoi zecchini, e nulla. Allora diventò pensieroso e, dimenticando le regole del Galateo e della buona creanza, tirò fuori una mano di tasca e si dette una lunghissima grattatina di capo.
-In quel mentre sentì fischiare negli orecchi una gran risata: e voltatosi in su, vide sopra un albero un grosso pappagallo che si spollinava le poche penne che aveva addosso.
-– Perché ridi? – gli domandò Pinocchio con voce di bizza.
-– Rido, perché nello spollinarmi mi son fatto il solletico sotto le ali.
-Il burattino non rispose. Andò alla gora e riempita d’acqua la solita ciabatta, si pose nuovamente ad annaffiare la terra che ricuopriva le monete d’oro.
-Quand’ecco che un’altra risata, anche più impertinente della prima, si fece sentire nella solitudine silenziosa di quel campo.
-– Insomma, – gridò Pinocchio, arrabbiandosi, – si può sapere, Pappagallo mal educato, di che cosa ridi?
-– Rido di quei barbagianni, che credono a tutte le scioccherie e che si lasciano trappolare da chi è più furbo di loro.
-– Parli forse di me?
-– Sì, parlo di te, povero Pinocchio, di te che sei così dolce di sale, da credere che i denari si possano seminare e raccogliere nei campi, come si seminano i fagioli e le zucche. Anch’io l’ho creduto una volta, e oggi ne porto le pene. Oggi (ma troppo tardi!) mi son dovuto persuadere che per mettere insieme onestamente pochi soldi, bisogna saperseli guadagnare o col lavoro delle proprie mani o coll’ingegno della propria testa.
-– Non ti capisco, – disse il burattino, che già cominciava a tremare dalla paura.
-– Pazienza! Mi spiegherò meglio, – soggiunse il Pappagallo. – Sappi dunque che, mentre tu eri in città, la Volpe e il Gatto sono tornati in questo campo: hanno preso le monete d’oro sotterrate, e poi sono fuggiti come il vento. E ora chi li raggiunge, è bravo!
-Pinocchio restò a bocca aperta, e non volendo credere alle parole del Pappagallo, cominciò colle mani e colle unghie a scavare il terreno che aveva annaffiato. E scava, scava, scava, fece una buca così profonda, che ci sarebbe entrato per ritto un pagliaio: ma le monete non ci erano più.
-Allora, preso dalla disperazione, tornò di corsa in città e andò difilato in tribunale, per denunziare al giudice i due malandrini, che lo avevano derubato.
-Il giudice era uno scimmione della razza dei Gorilla: un vecchio scimmione rispettabile per la sua grave età, per la sua barba bianca e specialmente per i suoi occhiali d’oro, senza vetri, che era costretto a portare continuamente, a motivo di una flussione d’occhi, che lo tormentava da parecchi anni.
-Pinocchio, alla presenza del giudice, raccontò per filo e per segno l’iniqua frode, di cui era stato vittima; dette il nome, il cognome e i connotati dei malandrini, e finì col chiedere giustizia.
-Il giudice lo ascoltò con molta benignità: prese vivissima parte al racconto: s’intenerì, si commosse: e quando il burattino non ebbe più nulla da dire, allungò la mano e suonò il campanello.
-A quella scampanellata comparvero subito due can mastini vestiti da giandarmi.
-Allora il giudice, accennando Pinocchio ai giandarmi, disse loro:
-– Quel povero diavolo è stato derubato di quattro monete d’oro: pigliatelo dunque e mettetelo subito in prigione.
-Il burattino, sentendosi dare questa sentenza fra capo e collo, rimase di princisbecco e voleva protestare: ma i giandarmi, a scanso di perditempi inutili, gli tapparono la bocca e lo condussero in gattabuia.
-E lì v’ebbe a rimanere quattro mesi: quattro lunghissimi mesi: e vi sarebbe rimasto anche di più, se non si fosse dato un caso fortunatissimo. Perché bisogna sapere che il giovane Imperatore che regnava nella città di Acchiappa-citrulli, avendo riportato una gran vittoria contro i suoi nemici, ordinò grandi feste pubbliche, luminarie, fuochi artificiali, corse di barberi e velocipedi, e in segno di maggiore esultanza, volle che fossero aperte le carceri e mandati fuori tutti i malandrini.
-– Se escono di prigione gli altri, voglio uscire anch’io, – disse Pinocchio al carceriere.
-– Voi no, – rispose il carceriere, – perché voi non siete del bel numero...
-– Domando scusa, – replicò Pinocchio, – sono un malandrino anch’io.
-– In questo caso avete mille ragioni, – disse il carceriere; e levandosi il berretto rispettosamente e salutandolo, gli aprì le porte della prigione e lo lasciò scappare.
-
-XX Liberato dalla prigione, si avvia per tornare a casa della Fata; ma lungo la strada trova un serpente orribile, e poi rimane preso alla tagliuola.
-
-Figuratevi l’allegrezza di Pinocchio, quando si sentì libero. Senza stare a dire che è e che non è, uscì subito fuori della città e riprese la strada che doveva ricondurlo alla Casina della Fata.
-A motivo del tempo piovigginoso, la strada era diventata tutta un pantano e ci si andava fino a mezza gamba.
-Ma il burattino non se ne dava per inteso.
-Tormentato dalla passione di rivedere il suo babbo e la sua sorellina dai capelli turchini, correva a salti come un cane levriero, e nel correre le pillacchere gli schizzavano fin sopra il berretto. Intanto andava dicendo fra sé e sé:
-– Quante disgrazie mi sono accadute... E me le merito! perché io sono un burattino testardo e piccoso... e voglio far sempre tutte le cose a modo mio, senza dar retta a quelli che mi voglion bene e che hanno mille volte più giudizio di me!... Ma da questa volta in là, faccio proponimento di cambiar vita e di diventare un ragazzo ammodo e ubbidiente... Tanto ormai ho bell’e visto che i ragazzi, a essere disubbidienti, ci scapitano sempre e non ne infilano mai una per il su’ verso. E il mio babbo mi avrà aspettato?... Ce lo troverò a casa della Fata? è tanto tempo, pover’uomo, che non lo vedo più, che mi struggo di fargli mille carezze e di finirlo dai baci! E la Fata mi perdonerà la brutta azione che le ho fatto?... E pensare che ho ricevuto da lei tante attenzioni e tante cure amorose... e pensare che se oggi son sempre vivo, lo debbo a lei! Ma si può dare un ragazzo più ingrato e più senza cuore di me?...
-Nel tempo che diceva così, si fermò tutt’a un tratto spaventato e fece quattro passi indietro.
-Che cosa aveva veduto?...
-Aveva veduto un grosso Serpente, disteso attraverso alla strada, che aveva la pelle verde, gli occhi di fuoco e la coda appuntuta, che gli fumava come una cappa di camino.
-Impossibile immaginarsi la paura del burattino: il quale, allontanatosi più di mezzo chilometro, si mise a sedere sopra un monticello di sassi, aspettando che il Serpente se ne andasse una buona volta per i fatti suoi e lasciasse libero il passo della strada.
-Aspettò un’ora; due ore; tre ore; ma il Serpente era sempre là, e, anche di lontano, si vedeva il rosseggiare de’ suoi occhi di fuoco e la colonna di fumo che gli usciva dalla punta della coda.
-Allora Pinocchio, figurandosi di aver coraggio, si avvicinò a pochi passi di distanza, e facendo una vocina dolce, insinuante e sottile, disse al Serpente:
-– Scusi, signor Serpente, che mi farebbe il piacere di tirarsi un pochino da una parte, tanto da lasciarmi passare?
-Fu lo stesso che dire al muro. Nessuno si mosse.
-Allora riprese colla solita vocina:
-– Deve sapere, signor Serpente, che io vado a casa, dove c’è il mio babbo che mi aspetta e che è tanto tempo che non lo vedo più!... Si contenta dunque che io seguiti per la mia strada?
-Aspettò un segno di risposta a quella dimanda: ma la risposta non venne: anzi il Serpente, che fin allora pareva arzillo e pieno di vita, diventò immobile e quasi irrigidito. Gli occhi gli si chiusero e la coda gli smesse di fumare.
-– Che sia morto davvero?... – disse Pinocchio, dandosi una fregatina di mani dalla gran contentezza: e senza mettere tempo in mezzo, fece l’atto di scavalcarlo, per passare dall’altra parte della strada. Ma non aveva ancora finito di alzare la gamba, che il Serpente si rizzò all’improvviso, come una molla scattata: e il burattino, nel tirarsi indietro, spaventato, inciampò e cadde per terra.
-E per l’appunto cadde così male, che restò col capo conficcato nel fango della strada e con le gambe ritte su in aria.
-Alla vista di quel burattino, che sgambettava a capofitto con una velocità incredibile il Serpente fu preso da una tal convulsione di risa, che ridi, ridi, ridi, alla fine, dallo sforzo del troppo ridere, gli si strappò una vena sul petto: e quella volta morì davvero.
-Allora Pinocchio ricominciò a correre per arrivare a casa della Fata prima che si facesse buio. Ma lungo la strada non potendo più reggere ai morsi terribili della fame, saltò in un campo coll’intenzione di cogliere poche ciocche d’uva moscadella. Non l’avesse mai fatto!
-Appena giunto sotto la vite, crac... sentì stringersi le gambe da due ferri taglienti, che gli fecero vedere quante stelle c’erano in cielo.
-Il povero burattino era rimasto preso da una tagliuola appostata là da alcuni contadini per beccarvi alcune grosse faine, che erano il flagello di tutti i pollai del vicinato.
-
-XXI Pinocchio è preso da un contadino, il quale lo costringe a far da can da guardia a un pollaio.
-
-Pinocchio, come potete figurarvelo, si dette a piangere, a strillare, a raccomandarsi: ma erano pianti e grida inutili, perché lì all’intorno non si vedevano case, e dalla strada non passava anima viva.
-Intanto si fece notte.
-Un po’ per lo spasimo della tagliuola, che gli segava gli stinchi, e un po’ per la paura di trovarsi solo e al buio in mezzo a quei campi, il burattino principiava quasi a svenirsi; quando a un tratto vedendosi passare una Lucciola di sul capo, la chiamò e le disse:
-– O Lucciolina, mi faresti la carità di liberarmi da questo supplizio?...
-– Povero figliuolo! – replicò la Lucciola, fermandosi impietosita a guardarlo. – Come mai sei rimasto colle gambe attanagliate fra codesti ferri arrotati?
-– Sono entrato nel campo per cogliere due grappoli di quest’uva moscadella, e...
-– Ma l’uva era tua?
-– No...
-– E allora chi t’ha insegnato a portar via la roba degli altri?...
-– Avevo fame...
-– La fame, ragazzo mio, non è una buona ragione per potere appropriarsi la roba che non è nostra...
-– È vero, è vero! – gridò Pinocchio piangendo, – ma un’altra volta non lo farò più.
-A questo punto il dialogo fu interrotto da un piccolissimo rumore di passi, che si avvicinavano.
-Era il padrone del campo che veniva in punta di piedi a vedere se qualcuna di quelle faine, che mangiavano di nottetempo i polli, fosse rimasta al trabocchetto della tagliuola.
-E la sua maraviglia fu grandissima quando, tirata fuori la lanterna di sotto il pastrano, s’accorse che, invece di una faina, c’era rimasto preso un ragazzo.
-– Ah, ladracchiòlo! – disse il contadino incollerito, – dunque sei tu che mi porti via le galline?
-– Io no, io no! – gridò Pinocchio, singhiozzando. – Io sono entrato nel campo per prendere soltanto due grappoli d’uva!...
-– Chi ruba l’uva è capacissimo di rubare anche i polli. Lascia fare a me, che ti darò una lezione da ricordartene per un pezzo.
-E aperta la tagliuola, afferrò il burattino per la collottola e lo portò di peso fino a casa, come si porterebbe un agnellino di latte.
-Arrivato che fu sull’aia dinanzi alla casa, lo scaraventò in terra: e tenendogli un piede sul collo, gli disse:
-– Oramai è tardi e voglio andare a letto. I nostri conti li aggiusteremo domani. Intanto, siccome oggi mi è morto il cane che mi faceva la guardia di notte, tu prenderai subito il suo posto. Tu mi farai da cane di guardia.
-Detto fatto, gl’infilò al collo un grosso collare tutto coperto di spunzoni di ottone, e glielo strinse in modo da non poterselo levare passandoci la testa dentro. Al collare c’era attaccata una lunga catenella di ferro: e la catenella era fissata nel muro.
-– Se questa notte, – disse il contadino, – cominciasse a piovere, tu puoi andare a cuccia in quel casotto di legno, dove c’è sempre la paglia che ha servito di letto per quattr’anni al mio povero cane. E se per disgrazia venissero i ladri, ricordati di stare a orecchi ritti e di abbaiare.
-Dopo quest’ultimo avvertimento, il contadino entrò in casa chiudendo la porta con tanto di catenaccio: e il povero Pinocchio rimase accovacciato sull’aia, più morto che vivo, a motivo del freddo, della fame e della paura. E di tanto in tanto, cacciandosi rabbiosamente le mani dentro al collare, che gli serrava la gola, diceva piangendo:
-– Mi sta bene!... Pur troppo mi sta bene! Ho voluto fare lo svogliato, il vagabondo... ho voluto dar retta ai cattivi compagni, e per questo la sfortuna mi perseguita sempre. Se fossi stato un ragazzino per bene, come ce n’è tanti, se avessi avuto voglia di studiare e di lavorare, se fossi rimasto in casa col mio povero babbo, a quest’ora non mi troverei qui, in mezzo ai campi, a fare il cane di guardia alla casa d’un contadino. Oh, se potessi rinascere un’altra volta!... Ma oramai è tardi, e ci vuol pazienza!
-Fatto questo piccolo sfogo, che gli venne proprio dal cuore, entrò dentro il casotto e si addormentò.
-
-XXII Pinocchio scuopre i ladri e, in ricompensa di essere stato fedele, vien posto in libertà.
-
-Ed era già più di due ore che dormiva saporitamente; quando verso la mezzanotte fu svegliato da un bisbiglio e da un pissi-pissi di vocine strane, che gli parve di sentire nell’aia. Messa fuori la punta del naso dalla buca del casotto, vide riunite a consiglio quattro bestiuole di pelame scuro, che parevano gatti. Ma non erano gatti: erano faine, animaletti carnivori, ghiottissimi specialmente di uova e di pollastrine giovani. Una di queste faine, staccandosi dalle sue compagne, andò alla buca del casotto e disse sottovoce:
-– Buona sera, Melampo.
-– Io non mi chiamo Melampo, – rispose il burattino.
-– O dunque chi sei?
-– Io sono Pinocchio.
-– E che cosa fai costì?
-– Faccio il cane di guardia.
-– O Melampo dov’è? dov’è il vecchio cane, che stava in questo casotto?
-– È morto questa mattina.
-– Morto? Povera bestia! Era tanto buono!... Ma giudicandoti alla fisonomia, anche te mi sembri un cane di garbo.
-– Domando scusa, io non sono un cane!...
-– O chi sei?
-– Io sono un burattino.
-– E fai da cane di guardia?
-– Purtroppo: per mia punizione!...
-– Ebbene, io ti propongo gli stessi patti, che avevo col defunto Melampo: e sarai contento.
-– E questi patti sarebbero?
-– Noi verremo una volta la settimana, come per il passato, a visitare di notte questo pollaio, e porteremo via otto galline. Di queste galline, sette le mangeremo noi, e una la daremo a te, a condizione, s’intende bene, che tu faccia finta di dormire e non ti venga mai l’estro di abbaiare e di svegliare il contadino.
-– E Melampo faceva proprio così? – domandò Pinocchio.
-– Faceva così, e fra noi e lui siamo andati sempre d’accordo. Dormi dunque tranquillamente, e stai sicuro che prima di partire di qui, ti lasceremo sul casotto una gallina bell’e pelata, per la colazione di domani. Ci siamo intesi bene?
-– Anche troppo bene!... – rispose Pinocchio: e tentennò il capo in un certo modo minaccioso, come se avesse voluto dire: «Fra poco ci riparleremo!».
-Quando le quattro faine si credettero sicure del fatto loro, andarono difilato al pollaio, che rimaneva appunto vicinissimo al casotto del cane, e aperta a furia di denti e di unghioli la porticina di legno, che ne chiudeva l’entratina, vi sgusciarono dentro, una dopo l’altra. Ma non erano ancora finite d’entrare, che sentirono la porticina richiudersi con grandissima violenza.
-Quello che l’aveva richiusa era Pinocchio; il quale, non contento di averla richiusa, vi posò davanti per maggior sicurezza una grossa pietra, a guisa di puntello.
-E poi cominciò ad abbaiare: e, abbaiando proprio come se fosse un cane di guardia, faceva colla voce bu-bu-bu-bu.
-A quell’abbaiata, il contadino saltò dal letto e, preso il fucile e affacciatosi alla finestra, domandò:
-– Che c’è di nuovo?
-– Ci sono i ladri! – rispose Pinocchio.
-– Dove sono?
-– Nel pollaio.
-– Ora scendo subito.
-E infatti, in men che non si dice amen, il contadino scese: entrò di corsa nel pollaio e, dopo avere acchiappate e rinchiuse in un sacco le quattro faine, disse loro con accento di vera contentezza:
-– Alla fine siete cascate nelle mie mani! Potrei punirvi, ma sì vil non sono! Mi contenterò, invece, di portarvi domani all’oste del vicino paese, il quale vi spellerà e vi cucinerà a uso lepre dolce e forte. È un onore che non vi meritate, ma gli uomini generosi come me non badano a queste piccolezze!...
-Quindi, avvicinatosi a Pinocchio, cominciò a fargli molte carezze, e, fra le altre cose, gli domandò:
-– Com’hai fatto a scuoprire il complotto di queste quattro ladroncelle? E dire che Melampo, il mio fido Melampo, non s’era mai accorto di nulla...
-Il burattino, allora, avrebbe potuto raccontare quel che sapeva: avrebbe potuto, cioè, raccontare i patti vergognosi che passavano fra il cane e le faine: ma ricordatosi che il cane era morto, pensò subito dentro di sé: – A che serve accusare i morti?... I morti son morti, e la miglior cosa che si possa fare è quella di lasciarli in pace!...
-– All’arrivo delle faine sull’aia, eri sveglio o dormivi? – continuò a chiedergli il contadino.
-– Dormivo, – rispose Pinocchio, – ma le faine mi hanno svegliato coi loro chiacchiericci, e una è venuta fin qui al casotto per dirmi: «Se prometti di non abbaiare e di non svegliare il padrone, noi ti regaleremo una pollastra bell’e pelata!...». Capite, eh? Avere la sfacciataggine di fare a me una simile proposta! Perché bisogna sapere che io sono un burattino, che avrò tutti i difetti di questo mondo: ma non avrò mai quello di star di balla e di reggere il sacco alla gente disonesta!
-– Bravo ragazzo! – gridò il contadino, battendogli sur una spalla. – Cotesti sentimenti ti fanno onore: e per provarti la mia grande soddisfazione, ti lascio libero fin d’ora di tornare a casa.
-E gli levò il collare da cane.
-
-XXIII Pinocchio piange la morte della bella Bambina dai capelli turchini: poi trova un Colombo che lo porta sulla riva del mare, e lì si getta nell’acqua per andare in aiuto del suo babbo Geppetto.
-
-Appena Pinocchio non sentì più il peso durissimo e umiliante di quel collare intorno al collo, si pose a scappare attraverso i campi, e non si fermò un solo minuto, finché non ebbe raggiunta la strada maestra, che doveva ricondurlo alla Casina della Fata.
-Arrivato sulla strada maestra, si voltò in giù a guardare nella sottoposta pianura, e vide benissimo a occhio nudo il bosco, dove disgraziatamente aveva incontrato la Volpe e il Gatto: vide, fra mezzo agli alberi, inalzarsi la cima di quella Quercia grande, alla quale era stato appeso ciondoloni per il collo: ma guarda di qua, guarda di là, non gli fu possibile di vedere la piccola casa della bella Bambina dai capelli turchini.
-Allora ebbe una specie di tristo presentimento e datosi a correre con quanta forza gli rimaneva nelle gambe, si trovò in pochi minuti sul prato, dove sorgeva una volta la Casina bianca. Ma la Casina bianca non c’era più. C’era, invece, una piccola pietra di marmo sulla quale si leggevano in carattere stampatello queste dolorose parole:
-QUI GIACE
-LA BAMBINA DAI CAPELLI TURCHINI
-MORTA DI DOLORE PER ESSERE STATA ABBANDONATA DAL SUO FRATELLINO PINOCCHIO
-Come rimanesse il burattino, quand’ebbe compitate alla peggio quelle parole, lo lascio pensare a voi. Cadde bocconi a terra e coprendo di mille baci quel marmo mortuario, dette in un grande scoppio di pianto. Pianse tutta la notte, e la mattina dopo, sul far del giorno, piangeva sempre, sebbene negli occhi non avesse più lacrime: e le sue grida e i suoi lamenti erano così strazianti e acuti, che tutte le colline all’intorno ne ripetevano l’eco.
-E piangendo diceva:
-– O Fatina mia, perché sei morta?... perché, invece di te, non sono morto io, che sono tanto cattivo, mentre tu eri tanto buona?... E il mio babbo, dove sarà? O Fatina mia, dimmi dove posso trovarlo, che voglio stare sempre con lui, e non lasciarlo più! più! più!... O Fatina mia, dimmi che non è vero che sei morta!... Se davvero mi vuoi bene... se vuoi bene al tuo fratellino, rivivisci... ritorna viva come prima!... Non ti dispiace a vedermi solo e abbandonato da tutti? Se arrivano gli assassini. mi attaccheranno daccapo al ramo dell’albero... e allora morirò per sempre. Che vuoi che faccia qui, solo in questo mondo? Ora che ho perduto te e il mio babbo, chi mi darà da mangiare? Dove anderò a dormire la notte? Chi mi farà la giacchettina nuova? Oh! sarebbe meglio, cento volte meglio, che morissi anch’io! Sì, voglio morire!... ih! ih! ih!...
-E mentre si disperava a questo modo, fece l’atto di volersi strappare i capelli: ma i suoi capelli, essendo di legno, non poté nemmeno levarsi il gusto di ficcarci dentro le dita.
-Intanto passò su per aria un grosso Colombo, il quale soffermatosi, a ali distese, gli gridò da una grande altezza:
-– Dimmi, bambino, che cosa fai costaggiù?
-– Non lo vedi? piango! – disse Pinocchio alzando il capo verso quella voce e strofinandosi gli occhi colla manica della giacchetta.
-– Dimmi, – soggiunse allora il Colombo – non conosci per caso fra i tuoi compagni, un burattino, che ha nome Pinocchio?
-– Pinocchio?... Hai detto Pinocchio? – ripeté il burattino saltando subito in piedi. – Pinocchio sono io!
-Il Colombo, a questa risposta, si calò velocemente e venne a posarsi a terra. Era più grosso di un tacchino.
-– Conoscerai dunque anche Geppetto? – domandò al burattino.
-– Se lo conosco? È il mio povero babbo! Ti ha forse parlato di me? Mi conduci da lui? Ma è sempre vivo? Rispondimi per carità: è sempre vivo?
-– L’ho lasciato tre giorni fa sulla spiaggia del mare.
-– Che cosa faceva?
-– Si fabbricava da sé una piccola barchetta per traversare l’Oceano. Quel pover’uomo sono più di quattro mesi che gira per il mondo in cerca di te: e non avendoti potuto trovare, ora si è messo in capo di cercarti nei paesi lontani del nuovo mondo.
-– Quanto c’è di qui alla spiaggia? – domandò Pinocchio con ansia affannosa.
-– Più di mille chilometri.
-– Mille chilometri? O Colombo mio, che bella cosa potessi avere le tue ali!...
-– Se vuoi venire, ti ci porto io.
-– Come?
-– A cavallo sulla mia groppa. Sei peso di molto?...
-– Peso? tutt’altro! Son leggiero come una foglia.
-E lì, senza stare a dir altro, Pinocchio saltò sulla groppa al Colombo e messa una gamba di qua e l’altra di là, come fanno i cavallerizzi, gridò tutto contento: – Galoppa, galoppa, cavallino, ché mi preme di arrivar presto!...
-Il Colombo prese l’aire e in pochi minuti arrivò col volo tanto in alto, che toccava quasi le nuvole. Giunto a quell’altezza straordinaria, il burattino ebbe la curiosità di voltarsi in giù a guardare: e fu preso da tanta paura e da tali giracapi che, per evitare il pericolo di venir disotto, si avviticchiò colle braccia, stretto stretto, al collo della sua piumata cavalcatura.
-Volarono tutto il giorno. Sul far della sera, il Colombo disse:
-– Ho una gran sete!
-– E io una gran fame! – soggiunse Pinocchio.
-– Fermiamoci a questa colombaia pochi minuti; e dopo ci rimetteremo in viaggio, per essere domattina all’alba sulla spiaggia del mare.
-Entrarono in una colombaia deserta, dove c’era soltanto una catinella piena d’acqua e un cestino ricolmo di veccie.
-Il burattino, in tempo di vita sua, non aveva mai potuto patire le veccie: a sentir lui, gli facevano nausea, gli rivoltavano lo stomaco: ma quella sera ne mangiò a strippapelle, e quando l’ebbe quasi finite, si voltò al Colombo e gli disse:
-– Non avrei mai creduto che le veccie fossero così buone!
-– Bisogna persuadersi, ragazzo mio, – replicò il Colombo, – che quando la fame dice davvero e non c’è altro da mangiare, anche le veccie diventano squisite! La fame non ha capricci né ghiottonerie!
-Fatto alla svelta un piccolo spuntino, si riposero in viaggio, e via! La mattina dopo arrivarono sulla spiaggia del mare.
-Il Colombo posò a terra Pinocchio, e non volendo nemmeno la seccatura di sentirsi ringraziare per aver fatto una buona azione, riprese subito il volo e sparì.
-La spiaggia era piena di gente che urlava e gesticolava guardando il mare.
-– Che cos’è accaduto? – domandò Pinocchio a una vecchina.
-– Gli è accaduto che un povero babbo, avendo perduto il figliolo, gli è voluto entrare in una barchetta per andare a cercarlo di là dal mare; e il mare oggi è molto cattivo e la barchetta sta per andare sott’acqua...
-– Dov’è la barchetta?
-– Eccola laggiù, diritta al mio dito, – disse la vecchia, accennando una piccola barca che, veduta in quella distanza, pareva un guscio di noce con dentro un omino piccino piccino.
-Pinocchio appuntò gli occhi da quella parte, e dopo aver guardato attentamente, cacciò un urlo acutissimo gridando:
-– Gli è il mi’ babbo! gli è il mi’ babbo!
-Intanto la barchetta, sbattuta dall’infuriare dell’onde, ora spariva fra i grossi cavalloni, ora tornava a galleggiare: e Pinocchio ritto sulla punta di un alto scoglio non finiva più dal chiamare il suo babbo per nome e dal fargli molti segnali colle mani e col moccichino da naso e perfino col berretto che aveva in capo.
-E parve che Geppetto, sebbene fosse molto lontano dalla spiaggia, riconoscesse il figliuolo, perché si levò il berretto anche lui e lo salutò e, a furia di gesti, gli fece capire che sarebbe tornato volentieri indietro, ma il mare era tanto grosso, che gl’impediva di lavorare col remo e di potersi avvicinare alla terra.
-Tutt’a un tratto, venne una terribile ondata, e la barca sparì.
-Aspettarono che la barca tornasse a galla: ma la barca non si vide più tornare.
-– Pover’omo! – dissero allora i pescatori, che erano raccolti sulla spiaggia: e brontolando sottovoce una preghiera si mossero per tornarsene alle loro case.
-Quand’ecco che udirono un urlo disperato, e, voltandosi indietro, videro un ragazzetto che, di vetta a uno scoglio, si gettava in mare gridando:
-– Voglio salvare il mio babbo!
-Pinocchio, essendo tutto di legno, galleggiava facilmente e nuotava come un pesce. Ora si vedeva sparire sott’acqua, portato dall’impeto dei flutti, ora riappariva fuori con una gamba o con un braccio, a grandissima distanza dalla terra. Alla fine lo persero d’occhio e non lo videro più.
-– Povero ragazzo! - dissero allora i pescatori, che erano raccolti sulla spiaggia: e brontolando sottovoce una preghiera tornarono alle loro case.
-
-XXIV Pinocchio arriva all’isola delle Api industriose e ritrova la Fata.
-
-Pinocchio, animato dalla speranza di arrivare in tempo a dare aiuto al suo povero babbo, nuotò tutta quanta la notte.
-E che orribile nottata fu quella! Diluviò, grandinò, tuonò spaventosamente, e con certi lampi che pareva di giorno.
-Sul far del mattino, gli riuscì di vedere poco distante una lunga striscia di terra. Era un’isola in mezzo al mare.
-Allora fece di tutto per arrivare a quella spiaggia: ma inutilmente. Le onde, rincorrendosi e accavallandosi, se lo abballottavano fra di loro, come se fosse stato un fuscello o un filo di paglia. Alla fine, e per sua buona fortuna, venne un’ondata tanto prepotente e impetuosa, che lo scaraventò di peso sulla rena del lido.
-Il colpo fu così forte che, battendo in terra, gli crocchiarono tutte le costole e tutte le congiunture: ma si consolò subito col dire:
-– Anche per questa volta l’ho proprio scampata bella!
-Intanto a poco a poco il cielo si rasserenò; il sole apparve fuori in tutto il suo splendore e il mare diventò tranquillissimo e buono come un olio.
-Allora il burattino distese i suoi panni al sole per rasciugarli e si pose a guardare di qua e di là se per caso avesse potuto scorgere su quella immensa spianata d’acqua una piccola barchetta con un omino dentro. Ma dopo aver guardato ben bene, non vide altro dinanzi a sé che cielo, mare e qualche vela di bastimento, ma così lontana, che pareva una mosca.
-– Sapessi almeno come si chiama quest’isola! – andava dicendo. – Sapessi almeno se quest’isola è abitata da gente di garbo, voglio dire da gente che non abbia il vizio di attaccare i ragazzi ai rami degli alberi; ma a chi mai posso domandarlo? A chi, se non c’è nessuno?...
-Quest’idea di trovarsi solo, solo, solo in mezzo a quel gran paese disabitato, gli messe addosso tanta malinconia, che stava lì lì per piangere; quando tutt’a un tratto vide passare, a poca distanza dalla riva, un grosso pesce, che se ne andava tranquillamente per i fatti suoi, con tutta la testa fuori dell’acqua.
-Non sapendo come chiamarlo per nome, il burattino gli gridò a voce alta, per farsi sentire:
-– Ehi, signor pesce, che mi permetterebbe una parola?
-– Anche due, – rispose il pesce, il quale era un Delfino così garbato, come se ne trovano pochi in tutti i mari del mondo.
-– Mi farebbe il piacere di dirmi se in quest’isola vi sono dei paesi dove si possa mangiare, senza pericolo d’esser mangiati?
-– Ve ne sono sicuro, – rispose il Delfino. – Anzi, ne troverai uno poco lontano di qui.
-– E che strada si fa per andarvi?
-– Devi prendere quella viottola là, a mancina, e camminare sempre diritto al naso. Non puoi sbagliare.
-– Mi dica un’altra cosa. Lei che passeggia tutto il giorno e tutta la notte per il mare, non avrebbe incontrato per caso una piccola barchettina con dentro il mi’ babbo?
-– E chi è il tuo babbo?
-– Gli è il babbo più buono del mondo, come io sono il figliuolo più cattivo che si possa dare.
-– Colla burrasca che ha fatto questa notte, – rispose il delfino, – la barchettina sarà andata sott’acqua.
-– E il mio babbo?
-– A quest’ora l’avrà inghiottito il terribile Pesce-cane, che da qualche giorno è venuto a spargere lo sterminio e la desolazione nelle nostre acque.
-– Che è grosso di molto questo Pesce-cane? – domandò Pinocchio, che digià cominciava a tremare dalla paura.
-– Se gli è grosso!... – replicò il Delfino. – Perché tu possa fartene un’idea, ti dirò che è più grosso di un casamento di cinque piani, ed ha una boccaccia così larga e profonda, che ci passerebbe comodamente tutto il treno della strada ferrata colla macchina accesa.
-– Mamma mia! – gridò spaventato il burattino: e rivestitosi in fretta e furia, si voltò al delfino e gli disse: – Arrivedella, signor pesce: scusi tanto l’incomodo e mille grazie della sua garbatezza.
-Detto ciò, prese subito la viottola e cominciò a camminare di un passo svelto; tanto svelto, che pareva quasi che corresse. E a ogni più piccolo rumore che sentiva, si voltava subito a guardare indietro, per la paura di vedersi inseguire da quel terribile pesce-cane grosso come una casa di cinque piani e con un treno della strada ferrata in bocca.
-Dopo mezz’ora di strada, arrivò a un piccolo paese detto «Il paese delle Api industriose». Le strade formicolavano di persone che correvano di qua e di là per le loro faccende: tutti lavoravano, tutti avevano qualche cosa da fare. Non si trovava un ozioso o un vagabondo nemmeno a cercarlo col lumicino.
-– Ho capito, – disse subito quello svogliato di Pinocchio, – questo paese non è fatto per me! Io non son nato per lavorare!
-Intanto la fame lo tormentava, perché erano oramai passate ventiquattr’ore che non aveva mangiato più nulla; nemmeno una pietanza di veccie.
-Che fare?
-Non gli restavano che due modi per potersi sdigiunare: o chiedere un po’ di lavoro, o chiedere in elemosina un soldo o un boccone di pane.
-A chiedere l’elemosina si vergognava: perché il suo babbo gli aveva predicato sempre che l’elemosina hanno il diritto di chiederla solamente i vecchi e gl’infermi. I veri poveri, in questo mondo, meritevoli di assistenza e di compassione, non sono altro che quelli che, per ragione d’età o di malattia, si trovano condannati a non potersi più guadagnare il pane col lavoro delle proprie mani. Tutti gli altri hanno l’obbligo di lavorare: e se non lavorano e patiscono la fame, tanto peggio per loro.
-In quel frattempo, passò per la strada un uomo tutto sudato e trafelato, il quale da sé tirava con gran fatica due carretti carichi di carbone.
-Pinocchio, giudicandolo dalla fisonomia per un buon uomo, gli si accostò e, abbassando gli occhi dalla vergogna, gli disse sottovoce:
-– Mi fareste la carità di darmi un soldo, perché mi sento morir dalla fame?
-– Non un soldo solo, – rispose il carbonaio, – ma te ne do quattro, a patto che tu m’aiuti a tirare fino a casa questi due carretti di carbone.
-– Mi meraviglio! – rispose il burattino quasi offeso, – per vostra regola io non ho fatto mai il somaro: io non ho mai tirato il carretto!...
-– Meglio per te! – rispose il carbonaio. – Allora, ragazzo mio, se ti senti davvero morir dalla fame, mangia due belle fette della tua superbia e bada di non prendere un’indigestione.
-Dopo pochi minuti passò per la via un muratore, che portava sulle spalle un corbello di calcina.
-– Fareste, galantuomo, la carità d’un soldo a un povero ragazzo, che sbadiglia dall’appetito?
-– Volentieri; vieni con me a portar calcina, – rispose il muratore, – e invece d’un soldo, te ne darò cinque.
-– Ma la calcina è pesa, – replicò Pinocchio, – e io non voglio durar fatica.
-– Se non vuoi durar fatica, allora, ragazzo mio, – divertiti a sbadigliare, e buon pro ti faccia.
-In men di mezz’ora passarono altre venti persone, e a tutte Pinocchio chiese un po’ d’elemosina, ma tutte gli risposero:
-– Non ti vergogni? Invece di fare il bighellone per la strada, và piuttosto a cercarti un po’ di lavoro, e impara a guadagnarti il pane!
-Finalmente passò una buona donnina che portava due brocche d’acqua.
-– Vi contentate, buona donna, che io beva una sorsata d’acqua alla vostra brocca? – disse Pinocchio, che bruciava dall’arsione della sete.
-– Bevi pure, ragazzo mio! – disse la donnina, posando le due brocche in terra.
-Quando Pinocchio ebbe bevuto come una spugna, borbottò a mezza voce, asciugandosi la bocca:
-– La sete me la sono levata! Così mi potessi levar la fame!...
-La buona donnina, sentendo queste parole, soggiunse subito:
-– Se mi aiuti a portare a casa una di queste brocche d’acqua, ti darò un bel pezzo di pane.
-Pinocchio guardò la brocca, e non rispose né sì né no.
-– E insieme col pane ti darò un bel piatto di cavolfiore condito coll’olio e coll’aceto, – soggiunse la buona donna.
-Pinocchio dette un’altra occhiata alla brocca, e non rispose né sì né no.
-– E dopo il cavolfiore ti darò un bel confetto ripieno di rosolio.
-Alle seduzioni di quest’ultima ghiottoneria, Pinocchio non seppe più resistere e, fatto un animo risoluto, disse:
-– Pazienza! Vi porterò la brocca fino a casa!
-La brocca era molto pesa, e il burattino, non avendo forza da portarla colle mani, si rassegnò a portarla in capo.
-Arrivati a casa, la buona donnina fece sedere Pinocchio a una piccola tavola apparecchiata e gli pose davanti il pane, il cavolfiore condito e il confetto.
-Pinocchio non mangiò, ma diluviò. Il suo stomaco pareva un quartiere rimasto vuoto e disabitato da cinque mesi.
-Calmati a poco a poco i morsi rabbiosi della fame, allora alzò il capo per ringraziare la sua benefattrice; ma non aveva ancora finito di fissarla in volto, che cacciò un lunghissimo ohhh!... di maraviglia e rimase là incantato, cogli occhi spalancati, colla forchetta per aria e colla bocca piena di pane e di cavolfiore.
-– Che cos’è mai tutta questa maraviglia? – disse ridendo la buona donna.
-– Egli è... – rispose balbettando Pinocchio, – egli è... egli è... che voi somigliate... voi mi rammentate... sì, sì, sì, la stessa voce... gli stessi occhi.. gli stessi capelli... sì, sì, sì... anche voi avete i capelli turchini... come lei!... O Fatina mia!... O Fatina mia!... ditemi che siete voi, proprio voi!... Non mi fate più piangere! Se sapeste!... Ho pianto tanto, ho patito tanto..
-E nel dir così, Pinocchio piangeva dirottamente, e gettandosi ginocchioni per terra, abbracciava i ginocchi di quella donnina misteriosa.
-
-XXV Pinocchio promette alla Fata di essere buono e di studiare, perché è stufo di fare il burattino e vuol diventare un bravo ragazzo.
-
-In sulle prime la buona donnina cominciò col dire che lei non era la piccola Fata dai capelli turchini: ma poi, vedendosi oramai scoperta e non volendo mandare più a lungo la commedia, fini col farsi riconoscere, e disse a Pinocchio:
-– Birba d’un burattino! Come mai ti sei accorto che ero io?
-– Gli è il gran bene che vi voglio quello che me l’ha detto.
-– Ti ricordi? Mi lasciasti bambina e ora mi ritrovi donna; tanto donna, che potrei quasi farti da mamma.
-– L’ho caro dimolto, perché così, invece di sorellina, vi chiamerò la mia mamma. Gli è tanto tempo che mi struggo di avere una mamma come tutti gli altri ragazzi!... Ma come avete fatto a crescere così presto?
-– È un segreto.
-– Insegnatemelo: vorrei crescere un poco anch’io. Non lo vedete? Sono sempre rimasto alto come un soldo di cacio.
-– Ma tu non puoi crescere, – replicò la Fata.
-– Perché?
-– Perché i burattini non crescono mai. Nascono burattini, vivono burattini e muoiono burattini.
-– Oh! sono stufo di far sempre il burattino! – gridò Pinocchio, dandosi uno scappellotto. – Sarebbe ora che diventassi anch’io un uomo come tutti gli altri.
-– E lo diventerai, se saprai meritartelo...
-– Davvero? E che posso fare per meritarmelo?
-– Una cosa facilissima: avvezzarti a essere un ragazzino perbene.
-– O che forse non sono?
-– Tutt’altro! I ragazzi perbene sono ubbidienti, e tu invece...
-– E io non ubbidisco mai.
-– I ragazzi perbene prendono amore allo studio e al lavoro, e tu...
-– E io, invece, faccio il bighellone e il vagabondo tutto l’anno.
-– I ragazzi perbene dicono sempre la verità...
-– E io sempre le bugie.
-– I ragazzi perbene vanno volentieri alla scuola...
-– E a me la scuola mi fa venire i dolori di corpo. Ma da oggi in poi voglio mutar vita.
-– Me lo prometti?
-– Lo prometto. Voglio diventare un ragazzino perbene e voglio essere la consolazione del mio babbo... Dove sarà il mio povero babbo a quest’ora?
-– Non lo so.
-– Avrò mai la fortuna di poterlo rivedere e abbracciare?
-– Credo di sì: anzi ne sono sicura.
-A questa risposta fu tale e tanta la contentezza di Pinocchio, che prese le mani alla Fata e cominciò a baciargliele con tanta foga, che pareva quasi fuori di sé. Poi, alzando il viso e guardandola amorosamente, le domandò:
-– Dimmi, mammina: dunque non è vero che tu sia morta?
-– Par di no, – rispose sorridendo la Fata.
-– Se tu sapessi, che dolore e che serratura alla gola che provai, quando lessi qui giace...
-– Lo so: ed è per questo che ti ho perdonato. La sincerità del tuo dolore mi fece conoscere che tu avevi il cuore buono: e dai ragazzi buoni di cuore, anche se sono un po’ monelli e avvezzati male, c’è sempre da sperar qualcosa: ossia, c’è sempre da sperare che rientrino sulla vera strada. Ecco perché son venuta a cercarti fin qui. Io sarò la tua mamma...
-– Oh! che bella cosa! – gridò Pinocchio saltando dall’allegrezza.
-– Tu mi ubbidirai e farai sempre quello che ti dirò io.
-– Volentieri, volentieri, volentieri!
-– Fino da domani, – soggiunse la Fata, – tu comincerai coll’andare a scuola.
-Pinocchio diventò subito un po’ meno allegro.
-– Poi sceglierai a tuo piacere un’arte o un mestiere...
-Pinocchio diventò serio.
-– Che cosa brontoli fra i denti? – domandò la Fata con accento risentito.
-– Dicevo... – mugolò il burattino a mezza voce, – che oramai per andare a scuola mi pare un po’ tardi...
-– Nossignore. Tieni a mente che per istruirsi e per imparare non è mai tardi.
-– Ma io non voglio fare né arti né mestieri...
-– Perché?
-– Perché a lavorare mi par fatica.
-– Ragazzo mio, – disse la Fata, – quelli che dicono così, finiscono quasi sempre o in carcere o all’ospedale. L’uomo, per tua regola, nasca ricco o povero, è obbligato in questo mondo a far qualcosa, a occuparsi, a lavorare. Guai a lasciarsi prendere dall’ozio! L’ozio è una bruttissima malattia, e bisogna guarirla subito, fin da ragazzi: se no, quando siamo grandi, non si guarisce più.
-Queste parole toccarono l’animo di Pinocchio, il quale rialzando vivacemente la testa disse alla Fata:
-– Io studierò, io lavorerò, io farò tutto quello che mi dirai, perché, insomma, la vita del burattino mi è venuta a noia, e voglio diventare un ragazzo a tutti i costi. Me l’hai promesso, non è vero?
-– Te l’ho promesso, e ora dipende da te.
-
-XXVI Pinocchio va co’ suoi compagni di scuola in riva al mare, per vedere il terribile Pescecane.
-
-Il giorno dopo Pinocchio andò alla scuola comunale.
-Figuratevi quelle birbe di ragazzi, quando videro entrare nella loro scuola un burattino! Fu una risata, che non finiva più. Chi gli faceva uno scherzo, chi un altro; chi gli levava il berretto di mano; chi gli tirava il giubbettino di dietro; chi si provava a fargli coll’inchiostro due grandi baffi sotto il naso; e chi si attentava perfino a legargli dei fili ai piedi e alle mani per farlo ballare.
-Per un poco Pinocchio usò disinvoltura e tirò via; ma finalmente, sentendosi scappar la pazienza, si rivolse a quelli, che più lo tafanavano e si pigliavano gioco di lui, e disse loro a muso duro:
-– Badate, ragazzi: io non son venuto qui per essere il vostro buffone. Io rispetto gli altri e voglio essere rispettato.
-– Bravo berlicche! Hai parlato come un libro stampato! – urlarono quei monelli, buttandosi via dalle matte risate: e uno di loro, più impertinente degli altri allungò la mano coll’idea di prendere il burattino per la punta del naso.
-Ma non fece a tempo: perché Pinocchio stese la gamba sotto la tavola e gli consegnò una pedata negli stinchi.
-– Ohi! che piedi duri! – urlò il ragazzo stropicciandosi il livido che gli aveva fatto il burattino.
-– E che gomiti!... anche più duri dei piedi! – disse un altro che, per i suoi scherzi sguaiati, s’era beccata una gomitata nello stomaco.
-Fatto sta che dopo quel calcio e quella gomitata Pinocchio acquistò subito la stima e la simpatia di tutti i ragazzi di scuola: e tutti gli facevano mille carezze e tutti gli volevano un bene dell’anima.
-E anche il maestro se ne lodava, perché lo vedeva attento, studioso, intelligente, sempre il primo a entrare nella scuola, sempre l’ultimo a rizzarsi in piedi, a scuola finita.
-Il solo difetto che avesse era quello di bazzicare troppi compagni: e fra questi, c’erano molti monelli conosciutissimi per la loro poca voglia di studiare e di farsi onore.
-Il maestro lo avvertiva tutti i giorni, e anche la buona Fata non mancava di dirgli e di ripetergli più volte:
-– Bada, Pinocchio! Quei tuoi compagnacci di scuola finiranno prima o poi col farti perdere l’amore allo studio e, forse forse, col tirarti addosso qualche grossa disgrazia.
-– Non c’è pericolo! – rispondeva il burattino, facendo una spallucciata e toccandosi coll’indice in mezzo alla fronte, come per dire: «C’è tanto giudizio qui dentro!».
-Ora avvenne che un bel giorno, mentre camminava verso scuola, incontrò un branco dei soliti compagni, che andandogli incontro, gli dissero:
-– Sai la gran notizia?
-– No.
-– Qui nel mare vicino è arrivato un Pesce-cane, grosso come una montagna.
-– Davvero?... Che sia quel medesimo Pesce-cane di quando affogò il mio povero babbo?
-– Noi andiamo alla spiaggia per vederlo. Vieni anche tu?
-– Io, no: voglio andare a scuola.
-– Che t’importa della scuola? Alla scuola ci anderemo domani. Con una lezione di più o con una di meno, si rimane sempre gli stessi somari.
-– E il maestro che dirà?
-– Il maestro si lascia dire. È pagato apposta per brontolare tutto il giorno.
-– E la mia mamma?...
-– Le mamme non sanno mai nulla, – risposero quei malanni.
-– Sapete che cosa farò? – disse Pinocchio. – Il Pesce-cane voglio vederlo per certe mie ragioni... ma anderò a vederlo dopo la scuola.
-– Povero giucco! – ribatté uno del branco. – Che credi che un pesce di quella grossezza voglia star lì a fare il comodo tuo? Appena s’è annoiato, piglia il dirizzone per un’altra parte, e allora chi s’è visto s’è visto.
-– Quanto tempo ci vuole di qui alla spiaggia? – domandò il burattino.
-– Fra un’ora, siamo bell’e andati e tornati.
-– Dunque, via! e chi più corre, è più bravo! – gridò Pinocchio.
-Dato così il segnale della partenza, quel branco di monelli, coi loro libri e i loro quaderni sotto il braccio, si messero a correre attraverso ai campi; e Pinocchio era sempre avanti a tutti: pareva che avesse le ali ai piedi.
-Di tanto in tanto, voltandosi indietro, canzonava i suoi compagni rimasti a una bella distanza, e nel vederli, ansanti, trafelati, polverosi e con tanto di lingua fuori, se la rideva proprio di cuore. Lo sciagurato in quel momento non sapeva a quali paure e a quali orribili disgrazie andava incontro!...
-
-XXVII Gran combattimento fra Pinocchio e i suoi compagni: uno de’ quali essendo rimasto ferito, Pinocchio viene arrestato dai carabinieri.
-
-Giunto che fu sulla spiaggia, Pinocchio dette subito una grande occhiata sul mare; ma non vide nessun Pesce-cane.
-Il mare era tutto liscio come un gran cristallo da specchio.
-– O il Pesce-cane dov’è? – domandò, voltandosi ai compagni.
-– Sarà andato a far colazione, – rispose uno di loro, ridendo.
-– O si sarà buttato sul letto per far un sonnellino, – soggiunse un altro, ridendo più forte che mai.
-Da quelle risposte sconclusionate e da quelle risatacce grulle, Pinocchio capì che i suoi compagni gli avevano fatto una brutta celia, dandogli ad intendere una cosa che non era vera; e pigliandosela a male, disse a loro con voce di bizza:
-– E ora? Che sugo ci avete trovato a darmi ad intendere la storiella del Pesce-cane?
-– Il sugo c’è sicuro!... – risposero in coro quei monelli.
-– E sarebbe?...
-– Quello di farti perdere la scuola e di farti venire con noi. Non ti vergogni a mostrarti tutti i giorni così preciso e così diligente alle lezioni? Non ti vergogni a studiar tanto, come fai?
-– E se io studio, che cosa ve ne importa?
-– A noi ce ne importa moltissimo perché ci costringi a fare una brutta figura col maestro...
-– Perché?
-– Perché gli scolari che studiano fanno sempre scomparire quelli, come noi, che non hanno voglia di studiare. E noi non vogliamo scomparire! Anche noi abbiamo il nostro amor proprio!...
-– E allora che cosa devo fare per contentarvi?
-– Devi prendere a noia, anche tu, la scuola, la lezione e il maestro, che sono i nostri tre grandi nemici.
-– E se io volessi seguitare a studiare?
-– Noi non ti guarderemo più in faccia, e alla prima occasione ce la pagherai!...
-– In verità mi fate quasi ridere, – disse il burattino con una scrollatina di capo.
-– Ehi, Pinocchio! – gridò allora il più grande di quei ragazzi, andandogli sul viso. – Non venir qui a fare lo smargiasso: non venir qui a far tanto il galletto!... Perché se tu non hai paura di noi, noi non abbiamo paura di te! Ricordati che tu sei solo e noi siamo in sette.
-– Sette come i peccati mortali, – disse Pinocchio con una gran risata.
-– Avete sentito? Ci ha insultati tutti! Ci ha chiamati col nome di peccati mortali!...
-– Pinocchio! chiedici scusa dell’offesa... se no, guai a te!...
-– Cucù! – fece il burattino, battendosi coll’indice sulla punta del naso, in segno di canzonatura.
-– Pinocchio! la finisce male!...
-– Cucù!
-– Ne toccherai quanto un somaro!...
-– Cucù!
-– Ritornerai a casa col naso rotto!...
-– Cucù!
-– Ora il cucù te lo darò io! – gridò il più ardito di quei monelli. – Prendi intanto quest’acconto e serbalo per la cena di stasera.
-E nel dir così gli appiccicò un pugno sul capo.
-Ma fu, come si suol dire, botta e risposta; perché il burattino, come c’era da aspettarselo, rispose con un altro pugno: e lì, da un momento all’altro, il combattimento diventò generale e accanito.
-Pinocchio, sebbene fosse solo, si difendeva come un eroe. Con quei suoi piedi di legno durissimo lavorava così bene, da tener sempre i suoi nemici a rispettosa distanza. Dove i suoi piedi potevano arrivare e toccare, ci lasciavano sempre un livido per ricordo.
-Allora i ragazzi, indispettiti di non potersi misurare col burattino a corpo a corpo, pensarono bene di metter mano ai proiettili, e sciolti i fagotti de’ loro libri di scuola, cominciarono a scagliare contro di lui i Sillabari, le Grammatiche, i Giannettini, i Minuzzoli, i Racconti del Thouar, il Pulcino della Baccini e altri libri scolastici: ma il burattino, che era d’occhio svelto e ammalizzito, faceva sempre civetta a tempo, sicché i volumi, passandogli di sopra al capo, andavano tutti a cascare nel mare.
-Figuratevi i pesci! I pesci, credendo che quei libri fossero roba da mangiare, correvano a frotte a fior d’acqua; ma dopo avere abboccata qualche pagina o qualche frontespizio, la risputavano subito facendo con la bocca una certa smorfia, che pareva volesse dire: «Non è roba per noi: noi siamo avvezzi a cibarci molto meglio!»
-Intanto il combattimento s’inferociva sempre più, quand’ecco che un grosso Granchio, che era uscito fuori dell’acqua e s’era adagio adagio arrampicato fin sulla spiaggia, gridò con una vociaccia di trombone infreddato:
-– Smettetela, birichini che non siete altro! Queste guerre manesche fra ragazzi e ragazzi raramente vanno a finir bene. Qualche disgrazia accade sempre!...
-Povero Granchio! Fu lo stesso che avesse predicato al vento. Anzi quella birba di Pinocchio, voltandosi indietro a guardarlo in cagnesco, gli disse sgarbatamente:
-– Chétati, Granchio dell’uggia!... Faresti meglio a succiare due pasticche di lichene per guarire da codesta infreddatura di gola. Vai piuttosto a letto e cerca di sudare!
-In quel frattempo i ragazzi, che avevano finito oramai di tirare tutti i loro libri, occhiarono lì a poca distanza il fagotto dei libri del burattino, e se ne impadronirono in men che non si dice.
-Fra questi libri, v’era un volume rilegato in cartoncino grosso, colla costola e colle punte di cartapecora. Era un Trattato di Aritmetica. Vi lascio immaginare se era peso dimolto!
-Uno di quei monelli agguantò quel volume e, presa di mira la testa di Pinocchio, lo scagliò con quanta forza aveva nel braccio: ma invece di cogliere il burattino, colse nella testa uno dei compagni; il quale diventò bianco come un panno lavato, e non disse altro che queste parole:
-– O mamma mia, aiutatemi... perché muoio!
-Poi cadde disteso sulla rena del lido.
-Alla vista di quel morticino, i ragazzi spaventati si dettero a scappare a gambe e in pochi minuti non si videro più.
-Ma Pinocchio rimase lì, e sebbene per il dolore e per lo spavento, anche lui fosse più morto che vivo, nondimeno corse a inzuppare il suo fazzoletto nell’acqua del mare e si pose a bagnare la tempia del suo povero compagno di scuola. E intanto piangendo dirottamente e disperandosi, lo chiamava per nome e gli diceva:
-– Eugenio!... povero Eugenio mio!... apri gli occhi, e guardami!... Perché non mi rispondi? Non sono stato io, sai, che ti ho fatto tanto male! Credilo, non sono stato io!... Apri gli occhi, Eugenio... Se tieni gli occhi chiusi, mi farai morire anche me... O Dio mio! come farò ora a tornare a casa?... Con che coraggio potrò presentarmi alla mia buona mamma? Che sarà di me?... Dove fuggirò?... Dove andrò a nascondermi?... Oh! quant’era meglio, mille volte meglio che fossi andato a scuola!... Perché ho dato retta a questi compagni, che sono la mia dannazione?... E il maestro me l’aveva detto!... e la mia mamma me lo aveva ripetuto: «Guàrdati dai cattivi compagni!». Ma io sono un testardo... un caparbiaccio... lascio dir tutti, e poi fo sempre a modo mio!... E dopo mi tocca a scontarle... E così, da che sono al mondo, non ho mai avuto un quarto d’ora di bene. Dio mio! Che sarà di me, che sarà di me, che sarà di me?...
-E Pinocchio continuava a piangere, e berciare, a darsi pugni nel capo e a chiamar per nome il povero Eugenio: quando sentì a un tratto un rumore sordo di passi che si avvicinavano.
-Si voltò: erano due carabinieri
-– Che cosa fai così sdraiato per terra? – domandarono a Pinocchio.
-– Assisto questo mio compagno di scuola.
-– Che gli è venuto male?
-– Par di sì!..
-– Altro che male! – disse uno dei carabinieri, chinandosi e osservando Eugenio da vicino. – Questo ragazzo è stato ferito in una tempia: chi è che l’ha ferito?
-– Io no, – balbettò il burattino che non aveva più fiato in corpo.
-– Se non sei stato tu, chi è stato dunque che l’ha ferito?
-– Io no, – ripeté Pinocchio.
-– E con che cosa è stato ferito?
-– Con questo libro. – E il burattino raccattò di terra il Trattato di Aritmetica, rilegato in cartone e cartapecora, per mostrarlo al carabiniere.
-– E questo libro di chi è?
-– Mio.
-– Basta così: non occorre altro. Rìzzati subito e vieni via con noi.
-– Ma io...
-– Via con noi!
-– Ma io sono innocente...
-– Via con noi!
-Prima di partire, i carabinieri chiamarono alcuni pescatori, che in quel momento passavano per l’appunto colla loro barca vicino alla spiaggia, e dissero loro:
-– Vi affidiamo questo ragazzetto ferito nel capo. Portatelo a casa vostra e assistetelo. Domani torneremo a vederlo.
-Quindi si volsero a Pinocchio, e dopo averlo messo in mezzo a loro due, gl’intimarono con accento soldatesco:
-– Avanti! e cammina spedito! se no, peggio per te!
-Senza farselo ripetere, il burattino cominciò a camminare per quella viottola, che conduceva al paese. Ma il povero diavolo non sapeva più nemmeno lui in che mondo si fosse. Gli pareva di sognare, e che brutto sogno! Era fuori di sé. I suoi occhi vedevano tutto doppio: le gambe gli tremavano: la lingua gli era rimasta attaccata al palato e non poteva più spiccicare una sola parola. Eppure, in mezzo a quella specie di stupidità e di rintontimento, una spina acutissima gli bucava il cuore: il pensiero, cioè, di dover passare sotto le finestre di casa della sua buona Fata, in mezzo ai carabinieri. Avrebbe preferito piuttosto di morire.
-Erano già arrivati e stavano per entrare in paese, quando una folata di vento strapazzone levò di testa a Pinocchio il berretto, portandoglielo lontano una decina di passi.
-– Si contentano, – disse il burattino ai carabinieri, – che vada a riprendere il mio berretto?
-– Vai pure: ma facciamo una cosa lesta.
-Il burattino andò, raccattò il berretto... ma invece di metterselo in capo, se lo mise in bocca fra i denti, e poi cominciò a correre di gran carriera verso la spiaggia del mare. Andava via come una palla di fucile.
-I carabinieri, giudicando che fosse difficile raggiungerlo, gli aizzarono dietro un grosso cane mastino, che aveva guadagnato il primo premio in tutte le corse dei cani. Pinocchio correva, e il cane correva più di lui: per cui tutta la gente si affacciava alle finestre e si affollava in mezzo alla strada, ansiosa di veder la fine di questo palio feroce.
-Ma non poté levarsi questa voglia, perché il cane mastino e Pinocchio sollevarono lungo la strada un tal polverone, che dopo pochi minuti non fu più possibile di veder nulla.
-
-XXVIII Pinocchio corre pericolo di essere fritto in padella come un pesce.
-
-Durante quella corsa disperata, vi fu un momento terribile, un momento in cui Pinocchio si credé perduto: perché bisogna sapere che Alidoro (era questo il nome del can-mastino) a furia di correre e correre, l’aveva quasi raggiunto.
-Basti dire che il burattino sentiva dietro di sé, alla distanza d’un palmo, l’ansare affannoso di quella bestiaccia e ne sentiva perfino la vampa calda delle fiatate.
-Per buona fortuna la spiaggia era oramai vicina e il mare si vedeva lì a pochi passi.
-Appena fu sulla spiaggia, il burattino spiccò un bellissimo salto, come avrebbe potuto fare un ranocchio, e andò a cascare in mezzo all’acqua. Alidoro invece voleva fermarsi; ma trasportato dall’impeto della corsa, entrò nell’acqua anche lui. E quel disgraziato non sapeva nuotare; per cui cominciò subito ad annaspare colle zampe per reggersi a galla: ma più annaspava e più andava col capo sott’acqua.
-Quando torno a rimettere il capo fuori, il povero cane aveva gli occhi impauriti e stralunati, e, abbaiando, gridava.
-– Affogo! Affogo!
-– Crepa! – gli rispose Pinocchio da lontano, il quale si vedeva oramai sicuro da ogni pericolo.
-– Aiutami, Pinocchio mio!... salvami dalla morte!...
-A quelle grida strazianti, il burattino, che in fondo aveva un cuore eccellente, si mosse a compassione, e voltosi al cane gli disse:
-– Ma se io ti aiuto a salvarti, mi prometti di non darmi più noia e di non corrermi dietro?
-– Te lo prometto! Te lo prometto! Spicciati per carità, perché se indugi un altro mezzo minuto, son bell’e morto.
-Pinocchio esitò un poco: ma poi ricordandosi che il suo babbo gli aveva detto tante volte che a fare una buona azione non ci si scapita mai, andò nuotando a raggiungere Alidoro, e, presolo per la coda con tutte e due le mani, lo portò sano e salvo sulla rena asciutta del lido.
-Il povero cane non si reggeva più in piedi. Aveva bevuto, senza volerlo, tant’acqua salata, che era gonfiato come un pallone. Per altro il burattino, non volendo fare a fidarsi troppo, stimò cosa prudente di gettarsi novamente in mare; e, allontanandosi dalla spiaggia, gridò all’amico salvato:
-– Addio, Alidoro, fai buon viaggio e tanti saluti a casa.
-– Addio, Pinocchio, – rispose il cane; – mille grazie di avermi liberato dalla morte. Tu mi hai fatto un gran servizio: e in questo mondo quel che è fatto è reso. Se capita l’occasione, ci riparleremo.
-Pinocchio seguitò a nuotare, tenendosi sempre vicino alla terra. Finalmente gli parve di esser giunto in un luogo sicuro; e dando un’ occhiata alla spiaggia, vide sugli scogli una specie di grotta, dalla quale usciva un lunghissimo pennacchio di fumo.
-– In quella grotta, – disse allora fra sé, – ci deve essere del fuoco. Tanto meglio! Anderò a rasciugarmi e a riscaldarmi, e poi?... E poi sarà quel che sarà.
-Presa questa risoluzione, si avvicinò alla scogliera; ma quando fu lì per arrampicarsi, sentì qualche cosa sotto l’acqua che saliva, saliva, saliva e lo portava per aria. Tentò subito di fuggire, ma oramai era tardi, perché con sua grandissima maraviglia si trovò rinchiuso dentro a una grossa rete in mezzo a un brulichio di pesci d’ogni forma e grandezza, che scodinzolando si dibattevano come tant’anime disperate.
-E nel tempo stesso vide uscire dalla grotta un pescatore così brutto, ma tanto brutto, che pareva un mostro marino. Invece di capelli aveva sulla testa un cespuglio foltissimo di erba verde; verde era la pelle del suo corpo, verdi gli occhi, verde la barba lunghissima, che gli scendeva fin quaggiù. Pareva un grosso ramarro ritto su i piedi di dietro.
-Quando il pescatore ebbe tirata fuori la rete dal mare, gridò tutto contento:
-– Provvidenza benedetta! Anch’oggi potrò fare una bella scorpacciata di pesce!
-– Manco male, che io non sono un pesce! – disse Pinocchio dentro di sé, ripigliando un po’ di coraggio.
-La rete piena di pesci fu portata dentro la grotta, una grotta buia e affumicata, in mezzo alla quale friggeva una gran padella d’olio, che mandava un odorino di moccolaia da mozzare il respiro.
-– Ora vediamo un po’ che pesci abbiamo presi! – disse il pescatore verde; e ficcando nella rete una manona così spropositata, che pareva una pala da fornai, tirò fuori una manciata di triglie.
-– Buone queste triglie! – disse, guardandole e annusandole con compiacenza. E dopo averle annusate, le scaraventò in una conca senz’acqua.
-Poi ripeté più volte la solita operazione; e via via che cavava fuori gli altri pesci, sentiva venirsi l’acquolina in bocca e gongolando diceva:
-– Buoni questi naselli!...
-– Squisiti questi muggini!...
-– Deliziose queste sogliole!...
-– Prelibati questi ragnotti!...
-– Carine queste acciughe col capo!...
-Come potete immaginarvelo, i naselli, i muggini, le sogliole, i ragnotti e le acciughe, andarono tutti alla rinfusa nella conca, a tener compagnia alle triglie.
-L’ultimo che restò nella rete fu Pinocchio.
-Appena il pescatore l’ebbe cavato fuori, sgranò dalla maraviglia i suoi occhioni verdi, gridando quasi impaurito:
-– Che razza di pesce è questo? Dei pesci fatti a questo modo non mi ricordo di averne mai mangiati!
-E tornò a guardarlo attentamente, e dopo averlo guardato ben bene per ogni verso, finì col dire:
-– Ho già capito: dev’essere un granchio di mare.
-Allora Pinocchio mortificato di sentirsi scambiare per un granchio, disse con accento risentito:
-– Ma che granchio e non granchio? Guardi come lei mi tratta! Io per sua regola sono un burattino.
-– Un burattino? – replicò il pescatore. – Dico la verità, il pesce burattino è per me un pesce nuovo! Meglio così! Ti mangerò più volentieri.
-– Mangiarmi? Ma la vuol capire che io non sono un pesce? O non sente che parlo, e ragiono come lei?
-– È verissimo, – soggiunse il pescatore, – e siccome vedo che sei un pesce, che hai la fortuna di parlare e di ragionare, come me, così voglio usarti anch’io i dovuti riguardi.
-– E questi riguardi sarebbero?...
-– In segno di amicizia e di stima particolare, lascerò a te la scelta del come vuoi essere cucinato. Desideri essere fritto in padella, oppure preferisci di essere cotto nel tegame colla salsa di pomidoro?
-– A dir la verità, – rispose Pinocchio, – se io debbo scegliere, preferisco piuttosto di essere lasciato libero, per potermene tornare a casa mia.
-– Tu scherzi? Ti pare che io voglia perdere l’occasione di assaggiare un pesce così raro? Non capita mica tutti i giorni un pesce burattino in questi mari. Lascia fare a me: ti friggerò in padella assieme a tutti gli altri pesci, e te ne troverai contento. L’esser fritto in compagnia è sempre una consolazione.
-L’infelice Pinocchio, a quest’antifona, cominciò a piangere, a strillare, a raccomandarsi e piangendo diceva: – Quant’era meglio, che fossi andato a scuola!... Ho voluto dar retta ai compagni, e ora la pago! Ih!... Ih!... Ih!...
-E perché si divincolava come un anguilla e faceva sforzi incredibili, per isgusciare dalle grinfie del pescatore verde, questi prese una bella buccia di giunco, e dopo averlo legato per le mani e per i piedi, come un salame, lo gettò in fondo alla conca cogli altri.
-Poi, tirato fuori un vassoiaccio di legno, pieno di farina, si dette a infarinare tutti quei pesci; e man mano che li aveva infarinati, li buttava a friggere dentro la padella.
-I primi a ballare nell’olio bollente furono i poveri naselli: poi toccò ai ragnotti, poi ai muggini, poi alle sogliole e alle acciughe, e poi venne la volta di Pinocchio. Il quale a vedersi così vicino alla morte (e che brutta morte!) fu preso da tanto tremito e da tanto spavento, che non aveva più né voce né fiato per raccomandarsi.
-Il povero figliuolo si raccomandava cogli occhi! Ma il pescatore verde, senza badarlo neppure, lo avvoltolò cinque o sei volte nella farina, infarinandolo così bene dal capo ai piedi, che pareva diventato un burattino di gesso.
-Poi lo prese per il capo, e...
-
-XXIX Ritorna a casa della Fata, la quale gli promette che il giorno dopo non sarà più un burattino, ma diventerà un ragazzo. Gran colazione di caffè-e-latte per festeggiare questo grande avvenimento.
-
-Mentre il pescatore era proprio sul punto di buttar Pinocchio nella padella, entrò nella grotta un grosso cane condotto là dall’odore acutissimo e ghiotto della frittura.
-– Passa via! – gli gridò il pescatore minacciandolo e tenendo sempre in mano il burattino infarinato.
-Ma il povero cane aveva una fame per quattro, e mugolando e dimenando la coda, pareva che dicesse: «Dammi un boccon di frittura e ti lascio in pace».
-– Passa via, ti dico! – gli ripeté il pescatore; e allungò la gamba per tirargli una pedata.
-Allora il cane che, quando aveva fame davvero, non era avvezzo a lasciarsi posar mosche sul naso, si rivoltò ringhioso al pescatore, mostrandogli le sue terribili zanne.
-In quel mentre si udì nella grotta una vocina fioca fioca, che disse:
-– Salvami, Alidoro!... Se non mi salvi, son fritto!
-Il cane riconobbe subito la voce di Pinocchio e si accorse con sua grandissima maraviglia che la vocina era uscita da quel fagotto infarinato che il pescatore teneva in mano.
-Allora che cosa fa? Spicca un gran lancio da terra, abbocca quel fagotto infarinato e tenendolo leggermente coi denti, esce correndo dalla grotta, e via come un baleno!
-Il pescatore, arrabbiatissimo di vedersi strappar di mano un pesce, che egli avrebbe mangiato tanto volentieri, si provò a rincorrere il cane; ma fatti pochi passi, gli venne un nodo di tosse e dové tornarsene indietro.
-Intanto Alidoro, ritrovata che ebbe la viottola che conduceva al paese, si fermò e posò delicatamente in terra l’amico Pinocchio.
-– Quanto ti debbo ringraziare! – disse il burattino.
-– Non c’è bisogno, – replicò il cane. – Tu salvasti me, e quel che è fatto, è reso. Si sa: in questo mondo bisogna tutti aiutarsi l’uno coll’altro.
-– Ma come mai sei capitato in quella grotta?
-– Ero sempre qui disteso sulla spiaggia più morto che vivo, quando il vento mi ha portato da lontano un odorino di frittura. Quell’odorino mi ha stuzzicato l’appetito, e io gli sono andato dietro. Se arrivavo un minuto più tardi!...
-– Non me lo dire! – urlò Pinocchio che tremava ancora dalla paura. – Non me lo dire! Se tu arrivavi un minuto più tardi, a quest’ora io ero bell’e fritto, mangiato e digerito. Brrr!... mi vengono i brividi soltanto a pensarvi!...
-Alidoro, ridendo, stese la zampa destra verso il burattino, il quale gliela strinse forte forte in segno di grande amicizia: e dopo si lasciarono.
-Il cane riprese la strada di casa: e Pinocchio, rimasto solo, andò a una capanna lì poco distante, e domandò a un vecchietto che stava sulla porta a scaldarsi al sole:
-– Dite, galantuomo, sapete nulla di un povero ragazzo ferito nel capo e che si chiamava Eugenio?...
-– Il ragazzo è stato portato da alcuni pescatori in questa capanna, e ora...
-Ora sarà morto!... – interruppe Pinocchio con gran dolore.
-– No: ora è vivo, ed è già ritornato a casa sua.
-– Davvero, davvero? – gridò il burattino, saltando dall’allegrezza. – Dunque la ferita non era grave?
-– Ma poteva riuscire gravissima e anche mortale, – rispose il vecchietto, – perché gli tirarono sul capo un grosso libro rilegato in cartone.
-– E chi glielo tirò?
-– Un suo compagno di scuola: un certo Pinocchio...
-– E chi è questo Pinocchio? – domandò il burattino facendo lo gnorri.
-– Dicono che sia un ragazzaccio, un vagabondo, un vero rompicollo...
-– Calunnie! Tutte calunnie!
-– Lo conosci tu questo Pinocchio?
-– Di vista! – rispose il burattino.
-– E tu che concetto ne hai? – gli chiese il vecchietto.
-– A me mi pare un gran buon figliuolo, pieno di voglia di studiare, ubbidiente, affezionato al suo babbo e alla sua famiglia...
-Mentre il burattino sfilava a faccia fresca tutte queste bugie, si toccò il naso e si accorse che il naso gli s’era allungato più d’un palmo. Allora tutto impaurito cominciò a gridare:
-– Non date retta, galantuomo, a tutto il bene che ve ne ho detto: perché conosco benissimo Pinocchio e posso assicurarvi anch’io che è davvero un ragazzaccio, un disubbidiente e uno svogliato, che invece di andare a scuola, va coi compagni a fare lo sbarazzino!
-Appena ebbe pronunziate queste parole, il suo naso raccorcì e tornò della grandezza naturale, come era prima.
-– E perché sei tutto bianco a codesto modo? – gli domandò a un tratto il vecchietto.
-– Vi dirò... senza avvedermene, mi sono strofinato a un muro, che era imbiancato di fresco, – rispose il burattino, vergognandosi a confessare che lo avevano infarinato come un pesce, per poi friggerlo in padella.
-– O della tua giacchetta, de’ tuoi calzoncini e del tuo berretto che cosa ne hai fatto?
-– Ho incontrato i ladri e mi hanno spogliato. Dite, buon vecchio, non avreste per caso da darmi un po’ di vestituccio, tanto perché io possa ritornare a casa?
-– Ragazzo mio, in fatto di vestiti, io non ho che un piccolo sacchetto, dove ci tengo i lupini. Se vuoi, piglialo: eccolo là.
-E Pinocchio non se lo fece dire due volte: prese subito il sacchetto dei lupini che era vuoto, e dopo averci fatto colle forbici una piccola buca nel fondo e due buche dalle parti, se lo infilò a uso camicia. E vestito leggerino a quel modo, si avviò verso il paese.
-Ma, lungo la strada, non si sentiva punto tranquillo; tant’è vero che faceva un passo avanti e uno indietro e, discorrendo da se solo, andava dicendo:
-– Come farò a presentarmi alla mia buona Fatina? Che dirà quando mi vedrà?... Vorrà perdonarmi questa seconda birichinata?... Scommetto che non me la perdona!... Oh! Non me la perdona di certo... E mi sta il dovere: perché io sono un monello che prometto sempre di correggermi, e non mantengo mai!...
-Arrivò al paese che era già notte buia, e perché faceva tempaccio e l’acqua veniva giù a catinelle, andò diritto diritto alla casa della Fata coll’animo risoluto di bussare alla porta e di farsi aprire.
-Ma, quando fu lì, sentì mancarsi il coraggio, e invece di bussare si allontanò, correndo, una ventina di passi. Si avvicinò una seconda volta alla porta, e non concluse nulla: si avvicinò una terza volta, e nulla: la quarta volta prese, tremando, il battente di ferro in mano, e bussò un piccolo colpettino.
-Aspetta, aspetta, finalmente dopo mezz’ora si aprì una finestra dell’ultimo piano (la casa era di quattro piani) e Pinocchio vide affacciarsi una grossa Lumaca, che aveva un lumicino acceso sul capo, la quale disse:
-– Chi è a quest’ora?
-– La Fata è in casa? – domandò il burattino.
-– La Fata dorme e non vuol essere svegliata: ma tu chi sei?
-– Sono io!
-– Chi io?
-– Pinocchio.
-– Chi Pinocchio?
-– Il burattino, quello che sta in casa colla Fata.
-– Ah! ho capito, – disse la Lumaca. – Aspettami costì, che ora scendo giù e ti apro subito.
-– Spicciatevi, per carità, perché io muoio dal freddo.
-– Ragazzo mio, io sono una lumaca, e le lumache non hanno mai fretta.
-Intanto passò un’ora, ne passarono due, e la porta non si apriva: per cui Pinocchio, che tremava dal freddo, dalla paura e dall’acqua che aveva addosso, si fece cuore e bussò una seconda volta, e bussò più forte. A quel secondo colpo si aprì una finestra del piano di sotto e si affacciò la solita Lumaca.
-– Lumachina bella, – gridò Pinocchio dalla strada, – sono due ore che aspetto! E due ore, a questa serataccia, diventano più lunghe di due anni. Spicciatevi, per carità.
-– Ragazzo mio – gli rispose dalla finestra quella bestiola tutta pace e tutta flemma, – ragazzo mio, io sono una lumaca, e le lumache non hanno mai fretta.
-E la finestra si richiuse.
-Di lì a poco suonò la mezzanotte: poi il tocco, poi le due dopo mezzanotte, e la porta era sempre chiusa.
-Allora Pinocchio, perduta la pazienza, afferrò con rabbia il battente della porta per bussare un gran colpo da far rintronare tutto il casamento: ma il battente che era di ferro, diventò a un tratto un’anguilla viva, che sgusciandogli dalle mani sparì nel rigagnolo d’acqua in mezzo alla strada.
-– Ah, sì? – gridò Pinocchio sempre più accecato dalla collera. – Se il battente è sparito, io seguiterò a bussare a furia di calci.
-E tiratosi un poco indietro, lasciò andare una solennissima pedata nell’uscio della casa. Il colpo fu così forte, che il piede penetrò nel legno fino a mezzo: e quando il burattino si provò a ricavarlo fuori, fu tutta fatica inutile: perché il piede c’era rimasto conficcato dentro, come un chiodo ribadito.
-Figuratevi il povero Pinocchio! Dové passare tutto il resto della notte con un piede in terra e con quell’altro per aria.
-La mattina, sul far del giorno, finalmente la porta si aprì.
-Quella brava bestiola della Lumaca, a scendere dal quarto piano fino all’uscio di strada, ci aveva messo solamente nove ore. Bisogna proprio dire che avesse fatto una sudata!
-– Che cosa fate con codesto piede conficcato nell’uscio? – domandò ridendo al burattino.
-– È stata una disgrazia. Vedete un po’, Lumachina bella, se vi riesce di liberarmi da questo supplizio.
-– Ragazzo mio, così ci vuole un legnaiolo, e io non ho mai fatto la legnaiola.
-– Pregate la Fata da parte mia!...
-– La Fata dorme e non vuol essere svegliata.
-– Ma che cosa volete che io faccia inchiodato tutto il giorno a questa porta?
-– Divèrtiti a contare le formicole che passano per la strada.
-– Portatemi almeno qualche cosa da mangiare, perché mi sento rifinito.
-– Subito! – disse la Lumaca.
-Difatti dopo tre ore e mezzo Pinocchio la vide tornare con un vassoio d’argento in capo. Nel vassoio c’era un pane, un pollastro arrosto e quattro albicocche mature.
-– Ecco la colazione che vi manda la Fata, – disse la Lumaca.
-Alla vista di quella grazia di Dio, il burattino sentì consolarsi tutto.
-Ma quale fu il suo disinganno, quando incominciando a mangiare, si dové accorgere che il pane era di gesso, il pollastro di cartone e le quattro albicocche di alabastro, colorite al naturale.
-Voleva piangere, voleva darsi alla disperazione, voleva buttar via il vassoio e quel che c’era dentro: ma invece, o fosse il gran dolore o la gran languidezza di stomaco, fatto sta che cadde svenuto.
-Quando si riebbe, si trovò disteso sopra un sofà, e la Fata era accanto a lui.
-– Anche per questa volta ti perdono, – gli disse la Fata, – ma guai a te se me ne fai un’altra delle tue!...
-Pinocchio promise e giurò che avrebbe studiato, e che si sarebbe condotto sempre bene. E mantenne la parola per tutto il resto dell’anno. Difatti, agli esami delle vacanze, ebbe l’onore di essere il più bravo della scuola; e i suoi portamenti, in generale, furono giudicati così lodevoli e soddisfacenti, che la Fata, tutta contenta, gli disse:
-– Domani finalmente il tuo desiderio sarà appagato!
-– Cioè?
-– Domani finirai di essere un burattino di legno, e diventerai un ragazzo perbene.
-Chi non ha veduto la gioia di Pinocchio, a questa notizia tanto sospirata, non potrà mai figurarsela. Tutti i suoi amici e compagni di scuola dovevano essere invitati per il giorno dopo a una gran colazione in casa della Fata, per festeggiare insieme il grande avvenimento: e la Fata aveva fatto preparare dugento tazze di caffè-e-latte e quattrocento panini imburrati di sotto e di sopra. Quella giornata prometteva d’essere molto bella e molto allegra, ma...
-Disgraziatamente, nella vita dei burattini c’è sempre un ma, che sciupa ogni cosa.
-
-XXX Pinocchio, invece di diventare un ragazzo, parte di nascosto col suo amico Lucignolo per il Paese dei Balocchi.
-
-Com’è naturale, Pinocchio chiese subito alla Fata il permesso di andare in giro per la città a fare gli inviti: e la Fata gli disse:
-– Vai pure a invitare i tuoi compagni per la colazione di domani: ma ricordati di tornare a casa prima che faccia notte. Hai capito?
-– Fra un’ora prometto di essere bell’e ritornato, – replicò il burattino.
-– Bada, Pinocchio! I ragazzi fanno presto a promettere: ma il più delle volte, fanno tardi a mantenere.
-– Ma io non sono come gli altri: io, quando dico una cosa, la mantengo.
-– Vedremo. Caso poi tu disubbidissi, tanto peggio per te.
-– Perché?
-– Perché i ragazzi che non danno retta ai consigli di chi ne sa più di loro, vanno sempre incontro a qualche disgrazia.
-– E io l’ho provato! – disse Pinocchio. – Ma ora non ci ricasco più!
-– Vedremo se dici il vero.
-Senza aggiungere altre parole, il burattino salutò la sua buona Fata, che era per lui una specie di mamma, e cantando e ballando uscì fuori della porta di casa.
-In poco più d’un’ora, tutti i suoi amici furono invitati. Alcuni accettarono subito e di gran cuore: altri da principio si fecero un po’ pregare; ma quando seppero che i panini da inzuppare nel caffè-e-latte sarebbero stati imburrati anche dalla parte di fuori, finirono tutti col dire: «Verremo anche noi, per farti piacere».
-Ora bisogna sapere che Pinocchio, fra i suoi amici e compagni di scuola, ne aveva uno prediletto e carissimo, il quale si chiamava di nome Romeo: ma tutti lo chiamavano col soprannome di Lucignolo, per via del suo personalino asciutto, secco e allampanato, tale e quale come il lucignolo nuovo di un lumino da notte.
-Lucignolo era il ragazzo più svogliato e più birichino di tutta la scuola: ma Pinocchio gli voleva un gran bene. Difatti andò subito a cercarlo a casa, per invitarlo alla colazione, e non lo trovò: tornò una seconda volta, e Lucignolo non c’era: tornò una terza volta, e fece la strada invano.
-Dove poterlo ripescare? Cerca di qua, cerca di là, finalmente lo vide nascosto sotto il portico di una casa di contadini.
-– Che cosa fai costì? – gli domandò Pinocchio, avvicinandosi.
-– Aspetto la mezzanotte, per partire...
-– Dove vai?
-– Lontano, lontano, lontano!
-– E io che son venuto a cercarti a casa tre volte!...
-– Che cosa volevi da me?
-– Non sai il grande avvenimento? Non sai la fortuna che mi è toccata?
-– Quale?
-– Domani finisco di essere un burattino e divento un ragazzo come te, e come tutti gli altri.
-– Buon pro ti faccia.
-– Domani, dunque, ti aspetto a colazione a casa mia.
-– Ma se ti dico che parto questa sera.
-– A che ora?
-– Fra poco.
-– E dove vai?
-– Vado ad abitare in un paese... che è il più bel paese di questo mondo: una vera cuccagna!...
-– E come si chiama?
-– Si chiama il Paese dei Balocchi. Perché non vieni anche tu?
-– Io? no davvero!
-– Hai torto, Pinocchio! Credilo a me che, se non vieni, te ne pentirai. Dove vuoi trovare un paese più salubre per noialtri ragazzi? Lì non vi sono scuole: lì non vi sono maestri: lì non vi sono libri. In quel paese benedetto non si studia mai. Il giovedì non si fa scuola: e ogni settimana è composta di sei giovedì e di una domenica. Figùrati che le vacanze dell’autunno cominciano col primo di gennaio e finiscono coll’ultimo di dicembre. Ecco un paese, come piace veramente a me! Ecco come dovrebbero essere tutti i paesi civili!...
-– Ma come si passano le giornate nel Paese dei Balocchi?
-– Si passano baloccandosi e divertendosi dalla mattina alla sera. La sera poi si va a letto, e la mattina dopo si ricomincia daccapo. Che te ne pare?
-– Uhm!... – fece Pinocchio: e tentennò leggermente il capo, come dire: «È una vita che farei volentieri anch’io!».
-– Dunque, vuoi partire con me? Sì o no? Risolviti.
-– No, no, no e poi no. Oramai ho promesso alla mia buona Fata di diventare un ragazzo perbene, e voglio mantenere la promessa. Anzi, siccome vedo che il sole va sotto, così ti lascio subito e scappo via. Dunque addio e buon viaggio.
-– Dove corri con tanta furia?
-– A casa. La mia buona Fata vuole che ritorni prima di notte.
-– Aspetta altri due minuti.
-– Faccio troppo tardi.
-– Due minuti soli.
-– E se poi la Fata mi grida?
-– Lasciala gridare. Quando avrà gridato ben bene, si cheterà, – disse quella birba di Lucignolo.
-– E come fai? Parti solo o in compagnia?
-– Solo? Saremo più di cento ragazzi.
-– E il viaggio lo fate a piedi?
-– A mezzanotte passerà di qui il carro che ci deve prendere e condurre fin dentro ai confini di quel fortunatissimo paese.
-– Che cosa pagherei che ora fosse mezzanotte!...
-– Perché?
-– Per vedervi partire tutti insieme.
-– Rimani qui un altro poco e ci vedrai.
-– No, no: voglio ritornare a casa.
-– Aspetta altri due minuti.
-– Ho indugiato anche troppo. La Fata starà in pensiero per me.
-– Povera Fata! Che ha paura forse che ti mangino i pipistrelli?
-– Ma dunque, – soggiunse Pinocchio, – tu sei veramente sicuro che in quel paese non ci sono punte scuole?...
-– Neanche l’ombra.
-– E nemmeno maestri?...
-– Nemmen’uno.
-– E non c’è mai l’obbligo di studiare?
-– Mai, mai, mai!
-– Che bel paese! – disse Pinocchio, sentendo venirsi l’acquolina in bocca. – Che bel paese! Io non ci sono stato mai, ma me lo figuro!...
-– Perché non vieni anche tu?
-– È inutile che tu mi tenti! Oramai ho promesso alla mia buona Fata di diventare un ragazzo di giudizio, e non voglio mancare alla parola.
-– Dunque addio, e salutami tanto le scuole ginnasiali!... E anche quelle liceali, se le incontri per la strada.
-– Addio, Lucignolo: fai buon viaggio, divertiti e rammentati qualche volta degli amici.
-Ciò detto, il burattino fece due passi in atto di andarsene: ma poi, fermandosi e voltandosi all’amico, gli domandò:
-– Ma sei proprio sicuro che in quel paese tutte le settimane sieno composte di sei giovedì e di una domenica?
-– Sicurissimo.
-– Ma lo sai di certo che le vacanze abbiano principio col primo di gennaio e finiscano coll’ultimo di dicembre?
-– Di certissimo!
-– Che bel paese! – ripeté Pinocchio, sputando dalla soverchia consolazione.
-Poi, fatto un animo risoluto, soggiunse in fretta e furia:
-– Dunque, addio davvero: e buon viaggio.
-– Addio.
-– Fra quanto partirete?
-– Fra due ore!
-– Peccato! Se alla partenza mancasse un’ora sola, sarei quasi quasi capace di aspettare.
-– E la Fata?...
-– Oramai ho fatto tardi!... E tornare a casa un’ora prima o un’ora dopo, è lo stesso.
-– Povero Pinocchio! E se la Fata ti grida?
-– Pazienza! La lascerò gridare. Quando avrà gridato ben bene, si cheterà.
-Intanto si era già fatta notte e notte buia: quando a un tratto videro muoversi in lontananza un lumicino... e sentirono un suono di bubboli e uno squillo di trombetta, così piccolino e soffocato, che pareva il sibilo di una zanzara!
-– Eccolo! – gridò Lucignolo, rizzandosi in piedi.
-– Chi è? – domandò sottovoce Pinocchio.
-– È il carro che viene a prendermi. Dunque, vuoi venire, sì o no?
-– Ma è proprio vero, – domandò il burattino, – che in quel paese i ragazzi non hanno mai l’obbligo di studiare?
-– Mai, mai, mai!
-– Che bel paese!... che bel paese!... che bel paese!...
-
-XXXI Dopo cinque mesi di cuccagna, Pinocchio, con sua grande maraviglia, sente spuntarsi un bel paio d’orecchie asinine e diventa un ciuchino, con la coda e tutto.
-
-Finalmente il carro arrivò: e arrivò senza fare il più piccolo rumore, perché le sue ruote erano fasciate di stoppa e di cenci.
-Lo tiravano dodici pariglie di ciuchini, tutti della medesima grandezza, ma di diverso pelame.
-Alcuni erano bigi, altri bianchi, altri brizzolati a uso pepe e sale, e altri rigati a grandi strisce gialle e turchine. Ma la cosa più singolare era questa: che quelle dodici pariglie, ossia quei ventiquattro ciuchini, invece di essere ferrati come tutti le altre bestie da tiro o da soma, avevano ai piedi degli stivali da uomo di vacchetta bianca.
-E il conduttore del carro?...
-Figuratevi un omino più largo che lungo, tenero e untuoso come una palla di burro, con un visino di melarosa, una bocchina che rideva sempre e una voce sottile e carezzevole, come quella d’un gatto che si raccomanda al buon cuore della padrona di casa.
-Tutti i ragazzi, appena lo vedevano, ne restavano innamorati e facevano a gara nel montare sul suo carro, per essere condotti da lui in quella vera cuccagna conosciuta nella carta geografica col seducente nome di Paese dei Balocchi.
-Difatti il carro era già tutto pieno di ragazzetti fra gli otto e i dodici anni, ammonticchiati gli uni sugli altri, come tante acciughe nella salamoia. Stavano male, stavano pigiati, non potevano quasi respirare: ma nessuno diceva ohi!, nessuno si lamentava. La consolazione di sapere che fra poche ore sarebbero giunti in un paese, dove non c’erano né libri, né scuole, né maestri, li rendeva così contenti e rassegnati, che non sentivano né i disagi, né gli strapazzi, né la fame, né la sete, né il sonno.
-Appena che il carro si fu fermato, l’omino si volse a Lucignolo e con mille smorfie e mille manierine, gli domandò sorridendo:
-– Dimmi, mio bel ragazzo, vuoi venire anche tu in quel fortunato paese?
-– Sicuro che ci voglio venire.
-– Ma ti avverto, carino mio, che nel carro non c’è più posto. Come vedi, è tutto pieno!...
-– Pazienza! – replicò Lucignolo, – se non c’è posto dentro, io mi adatterò a star seduto sulle stanghe del carro.
-E spiccato un salto, montò a cavalcioni sulle stanghe.
-– E tu, amor mio?... – disse l’omino volgendosi tutto complimentoso a Pinocchio. – Che intendi fare? Vieni con noi, o rimani?...
-– Io rimango, – rispose Pinocchio. – Io voglio tornarmene a casa mia: voglio studiare e voglio farmi onore alla scuola, come fanno tutti i ragazzi perbene.
-– Buon pro ti faccia!
-– Pinocchio! – disse allora Lucignolo. – Dai retta a me: vieni via con noi e staremo allegri.
-– No, no, no!
-– Vieni via con noi e staremo allegri, – gridarono altre quattro voci di dentro al carro.
-– Vieni via con noi e staremo allegri, – urlarono tutte insieme un centinaio di voci di dentro al carro.
-– E se vengo con voi, che cosa dirà la mia buona Fata? – disse il burattino che cominciava a intenerirsi e a ciurlar nel manico.
-– Non ti fasciare il capo con tante melanconie. Pensa che andiamo in un paese dove saremo padroni di fare il chiasso dalla mattina alla sera!
-Pinocchio non rispose: ma fece un sospiro: poi fece un altro sospiro: poi un terzo sospiro; finalmente disse:
-– Fatemi un po’ di posto: voglio venire anch’io!...
-– I posti son tutti pieni, – replicò l’omino, – ma per mostrarti quanto sei gradito, posso cederti il mio posto a cassetta...
-– E voi?...
-– E io farò la strada a piedi.
-– No, davvero, che non lo permetto. Preferisco piuttosto di salire in groppa a qualcuno di questi ciuchini! – gridò Pinocchio.
-Detto fatto, si avvicinò al ciuchino manritto della prima pariglia e fece l’atto di volerlo cavalcare: ma la bestiola, voltandosi a secco, gli dette una gran musata nello stomaco e lo gettò a gambe all’aria.
-Figuratevi la risatona impertinente e sgangherata di tutti quei ragazzi presenti alla scena.
-Ma l’omino non rise. Si accostò pieno di amorevolezza al ciuchino ribelle, e, facendo finta di dargli un bacio, gli staccò con un morso la metà dell’orecchio destro.
-Intanto Pinocchio, rizzatosi da terra tutto infuriato, schizzò con un salto sulla groppa di quel povero animale. E il salto fu così bello, che i ragazzi, smesso di ridere, cominciarono a urlare: «Viva Pinocchio!» e a fare una smanacciata di applausi, che non finivano più.
-Quand’ecco che all’improvviso il ciuchino alzò tutt’e due le gambe di dietro, e dando una fortissima sgropponata, scaraventò il povero burattino in mezzo alla strada sopra un monte di ghiaia.
-Allora grandi risate daccapo: ma l’omino, invece di ridere, si sentì preso da tanto amore per quell’irrequieto asinello, che, con un bacio, gli portò via di netto la metà di quell’altro orecchio. Poi disse al burattino:
-– Rimonta pure a cavallo e non aver paura. Quel ciuchino aveva qualche grillo per il capo: ma io gli ho detto due paroline negli orecchi e spero di averlo reso mansueto e ragionevole.
-Pinocchio montò: e il carro cominciò a muoversi: ma nel tempo che i ciuchini galoppavano e che il carro correva sui ciotoli della via maestra, gli parve al burattino di sentire una voce sommessa e appena intelligibile, che gli disse:
-– Povero gonzo! Hai voluto fare a modo tuo, ma te ne pentirai!
-Pinocchio, quasi impaurito, guardò di qua e di là, per conoscere da qual parte venissero queste parole; ma non vide nessuno: i ciuchini galoppavano, il carro correva, i ragazzi dentro al carro dormivano, Lucignolo russava come un ghiro e l’omino seduto a cassetta, canterellava fra i denti:
-Tutti la notte dormono
-E io non dormo mai...
-Fatto un altro mezzo chilometro, Pinocchio sentì la solita vocina fioca che gli disse:
-– Tienlo a mente, grullerello! I ragazzi che smettono di studiare e voltano le spalle ai libri, alle scuole e ai maestri, per darsi interamente ai balocchi e ai divertimenti, non possono far altro che una fine disgraziata!... Io lo so per prova!... E te lo posso dire! Verrà un giorno che piangerai anche tu, come oggi piango io... ma allora sarà tardi!...
-A queste parole bisbigliate sommessamente, il burattino, spaventato più che mai, saltò giù dalla groppa della cavalcatura e andò a prendere il suo ciuchino per il muso.
-E immaginatevi come restò, quando s’accorse che il suo ciuchino piangeva... e piangeva proprio come un ragazzo!
-– Ehi, signor omino, – gridò allora Pinocchio al padrone del carro, – sapete che cosa c’è di nuovo? Questo ciuchino piange.
-– Lascialo piangere: riderà quando sarà sposo
-– Ma che forse gli avete insegnato anche a parlare ?
-– No: ha imparato da sé a borbottare qualche parola, essendo stato tre anni in una compagnia di cani ammaestrati.
-– Povera bestia!...
-– Via, via, – disse l’omino, – non perdiamo il nostro tempo a veder piangere un ciuco. Rimonta a cavallo, e andiamo: la notte è fresca e la strada è lunga.
-Pinocchio obbedì senza rifiatare. Il carro riprese la sua corsa: e la mattina, sul far dell’alba, arrivarono felicemente nel Paese dei Balocchi.
-Questo paese non somigliava a nessun altro paese del mondo. La sua popolazione era tutta composta di ragazzi. I più vecchi avevano quattordici anni: i più giovani ne avevano otto appena. Nelle strade, un’allegria, un chiasso, uno strillìo da levar di cervello! Branchi di monelli dappertutto. Chi giocava alle noci, chi alle piastrelle, chi alla palla, chi andava in velocipede, chi sopra a un cavallino di legno; questi facevano a mosca-cieca, quegli altri si rincorrevano; altri, vestiti da pagliacci, mangiavano la stoppa accesa: chi recitava, chi cantava, chi faceva i salti mortali, chi si divertiva a camminare colle mani in terra e colle gambe in aria; chi mandava il cerchio, chi passeggiava vestito da generale coll’elmo di foglio e lo squadrone di cartapesta; chi rideva, chi urlava, chi chiamava, chi batteva le mani, chi fischiava, chi rifaceva il verso alla gallina quando ha fatto l’ovo; insomma un tal pandemonio, un tal passeraio, un tal baccano indiavolato, da doversi mettere il cotone negli orecchi per non rimanere assorditi. Su tutte le piazze si vedevano teatrini di tela, affollati di ragazzi dalla mattina alla sera, e su tutti i muri delle case si leggevano scritte col carbone delle bellissime cose come queste: Viva i balocci (invece di balocchi): non voglamo più schole (invece di non vogliamo più scuole): abbasso Larin Metica (invece di l’aritmetica) e altri fiori consimili.
-Pinocchio, Lucignolo e tutti gli altri ragazzi, che avevano fatto il viaggio coll’omino, appena ebbero messo il piede dentro la città, si ficcarono subito in mezzo alla gran baraonda, e in pochi minuti, come è facile immaginarselo, diventarono gli amici di tutti. Chi più felice, chi più contento di loro?
-In mezzo ai continui spassi e agli svariati divertimenti, le ore, i giorni, le settimane, passavano come tanti baleni.
-– Oh! che bella vita! – diceva Pinocchio tutte le volte che per caso s’imbatteva in Lucignolo.
-– Vedi, dunque, se avevo ragione?... – ripigliava quest’ultimo. – E dire che tu non volevi partire! E pensare che t’eri messo in capo di tornartene a casa dalla tua Fata, per perdere il tempo a studiare!.... Se oggi ti sei liberato dalla noia dei libri e delle scuole, lo devi a me, ai miei consigli, alle mie premure, ne convieni? Non vi sono che i veri amici che sappiano rendere di questi grandi favori.
-– È vero, Lucignolo! Se oggi io sono un ragazzo veramente contento, è tutto merito tuo. E il maestro, invece, sai che cosa mi diceva, parlando di te? Mi diceva sempre: «Non praticare quella birba di Lucignolo perché Lucignolo è un cattivo compagno e non può consigliarti altro che a far del male!...».
-– Povero maestro! – replicò l’altro tentennando il capo. – Lo so purtroppo che mi aveva a noia e che si divertiva sempre a calunniarmi, ma io sono generoso e gli perdono!
-– Anima grande! – disse Pinocchio, abbracciando affettuosamente l’amico e dandogli un bacio in mezzo agli occhi.
-Intanto era già da cinque mesi che durava questa bella cuccagna di baloccarsi e di divertirsi le giornate intere, senza mai vedere in faccia né un libro, né una scuola, quando una mattina Pinocchio, svegliandosi, ebbe, come si suol dire, una gran brutta sorpresa che lo messe proprio di malumore.
-
-XXXII A Pinocchio gli vengono gli orecchi di ciuco, e poi diventa un ciuchino vero e comincia a ragliare.
-
-E questa sorpresa quale fu?
-Ve lo dirò io, miei cari e piccoli lettori: la sorpresa fu che Pinocchio, svegliandosi, gli venne fatto naturalmente di grattarsi il capo; e nel grattarsi il capo si accorse...
-Indovinate un po’ di che cosa si accorse?
-Si accorse con sua grandissima maraviglia che gli orecchi gli erano cresciuti più d’un palmo.
-Voi sapete che il burattino, fin dalla nascita, aveva gli orecchi piccini piccini: tanto piccini che, a occhio nudo, non si vedevano neppure! Immaginatevi dunque come restò, quando si poté scorgere che i suoi orecchi, durante la notte, erano così allungati, che parevano due spazzole di padule.
-Andò subito in cerca di uno specchio, per potersi vedere: ma non trovando uno specchio, empì d’acqua la catinella del lavamano, e specchiandovisi dentro, vide quel che non avrebbe mai voluto vedere: vide, cioè, la sua immagine abbellita di un magnifico paio di orecchi asinini.
-Lascio pensare a voi il dolore, la vergogna e la disperazione del povero Pinocchio!
-Cominciò a piangere, a strillare, a battere la testa nel muro: ma quanto più si disperava, e più i suoi orecchi crescevano, crescevano e diventavano pelosi verso la cima. Al rumore di quelle grida acutissime, entrò nella stanza una bella Marmottina, che abitava il piano di sopra: la quale, vedendo il burattino in così grandi smanie, gli domandò premurosamente:
-– Che cos’hai, mio caro casigliano?
-– Sono malato, Marmottina mia, molto malato... e malato d’una malattia che mi fa paura! Te ne intendi tu del polso?
-– Un pochino.
-– Senti dunque se per caso avessi la febbre.
-La Marmottina alzò la zampa destra davanti: e dopo aver tastato il polso di Pinocchio gli disse sospirando:
-– Amico mio, mi dispiace doverti dare una cattiva notizia!...
-– Cioè?
-– Tu hai una gran brutta febbre!...
-– E che febbre sarebbe?
-– È la febbre del somaro.
-– Non la capisco questa febbre! – rispose il burattino, che l’aveva pur troppo capita.
-– Allora te la spiegherò io, – soggiunse la Marmottina. – Sappi dunque che fra due o tre ore tu non sarai più burattino, né un ragazzo...
-– E che cosa sarò?
-– Fra due o tre ore, tu diventerai un ciuchino vero e proprio, come quelli che tirano il carretto e che portano i cavoli e l’insalata al mercato.
-– Oh! Povero me! Povero me! – gridò Pinocchio pigliandosi con le mani tutt’e due gli orecchi, e tirandoli e strapazzandoli rabbiosamente, come se fossero gli orecchi di un altro.
-– Caro mio, – replicò la Marmottina per consolarlo, – che cosa ci vuoi tu fare? Oramai è destino. Oramai è scritto nei decreti della sapienza, che tutti quei ragazzi svogliati che, pigliando a noia i libri, le scuole e i maestri, passano le loro giornate in balocchi, in giochi e in divertimenti, debbano finire prima o poi col trasformarsi in tanti piccoli somari.
-– Ma davvero è proprio così? – domandò singhiozzando il burattino.
-– Purtroppo è così! E ora i pianti sono inutili. Bisognava pensarci prima!
-– Ma la colpa non è mia: la colpa, credilo, Marmottina, è tutta di Lucignolo!...
-– E chi è questo Lucignolo!...
-– Un mio compagno di scuola. Io volevo tornare a casa: io volevo essere ubbidiente: io volevo seguitare a studiare e a farmi onore... ma Lucignolo mi disse: «Perché vuoi annoiarti a studiare? Perché vuoi andare alla scuola? Vieni piuttosto con me, nel Paese dei Balocchi: lì non studieremo più: lì ci divertiremo dalla mattina alla sera e staremo sempre allegri».
-– E perché seguisti il consiglio di quel falso amico? di quel cattivo compagno?
-– Perché?... Perché, Marmottina mia, io sono un burattino senza giudizio... e senza cuore. Oh! se avessi avuto un zinzino di cuore, non avrei mai abbandonato quella buona Fata, che mi voleva bene come una mamma e che aveva fatto tanto per me!... E a quest’ora non sarei più un burattino... ma sarei invece un ragazzino a modo, come ce n’è tanti! Oh!... ma se incontro Lucignolo, guai a lui! Gliene voglio dire un sacco e una sporta!
-E fece l’atto di volere uscire. Ma quando fu sulla porta, si ricordò che aveva gli orecchi d’asino, e vergognandosi di mostrarli al pubblico, che cosa inventò?... Prese un gran berretto di cotone, e, ficcatoselo in testa, se lo ingozzò fin sotto la punta del naso.
-Poi uscì: e si dette a cercar Lucignolo dappertutto. Lo cercò nelle strade, nelle piazze, nei teatrini, in ogni luogo: ma non lo trovò. Ne chiese notizia a quanti incontrò per la via, ma nessuno l’aveva veduto.
-Allora andò a cercarlo a casa: e arrivato alla porta bussò.
-– Chi è? – domandò Lucignolo di dentro.
-– Sono io! – rispose il burattino.
-– Aspetta un poco, e ti aprirò.
-Dopo mezz’ora la porta si aprì: e figuratevi come restò Pinocchio quando, entrando nella stanza, vide il suo amico Lucignolo con un gran berretto di cotone in testa, che gli scendeva fin sotto il naso.
-Alla vista di quel berretto, Pinocchio sentì quasi consolarsi e pensò subito dentro di sé:
-«Che l’amico sia malato della mia medesima malattia? Che abbia anche lui la febbre del ciuchino?...»
-E facendo finta di non essersi accorto di nulla, gli domandò sorridendo:
-– Come stai, mio caro Lucignolo?
-– Benissimo: come un topo in una forma di cacio parmigiano.
-– Lo dici proprio sul serio?
-– E perché dovrei dirti una bugia?
-– Scusami, amico: e allora perché tieni in capo codesto berretto di cotone che ti cuopre tutti gli orecchi?
-– Me l’ha ordinato il medico, perché mi sono fatto male a questo ginocchio. E tu, caro burattino, perché porti codesto berretto di cotone ingozzato fin sotto il naso?
-– Me l’ha ordinato il medico, perché mi sono sbucciato un piede.
-– Oh! povero Pinocchio!...
-– Oh! povero Lucignolo!...
-A queste parole tenne dietro un lunghissimo silenzio, durante il quale i due amici non fecero altro che guardarsi fra loro in atto di canzonatura.
-Finalmente il burattino, con una vocina melliflua e flautata, disse al suo compagno:
-– Levami una curiosità, mio caro Lucignolo: hai mai sofferto di malattia agli orecchi?
-– Mai!... E tu?
-– Mai! Per altro da questa mattina in poi ho un orecchio, che mi fa spasimare.
-– Ho lo stesso male anch’io.
-– Anche tu?... E qual è l’orecchio che ti duole?
-– Tutt’e due. E tu?
-– Tutt’e due. Che sia la medesima malattia?
-– Ho paura di sì?
-– Vuoi farmi un piacere, Lucignolo?
-– Volentieri! Con tutto il cuore.
-– Mi fai vedere i tuoi orecchi?
-– Perché no? Ma prima voglio vedere i tuoi, caro Pinocchio.
-– No: il primo devi essere tu.
-– No, carino! Prima tu, e dopo io!
-– Ebbene, – disse allora il burattino, – facciamo un patto da buoni amici.
-– Sentiamo il patto.
-– Leviamoci tutt’e due il berretto nello stesso tempo: accetti?
-– Accetto.
-– Dunque attenti!
-E Pinocchio cominciò a contare a voce alta:
-– Uno! Due! Tre!
-Alla parola tre! i due ragazzi presero i loro berretti di capo e li gettarono in aria.
-E allora avvenne una scena, che parrebbe incredibile, se non fosse vera. Avvenne, cioè, che Pinocchio e Lucignolo, quando si videro colpiti tutt’e due dalla medesima disgrazia, invece di restar mortificati e dolenti, cominciarono ad ammiccarsi i loro orecchi smisuratamente cresciuti, e dopo mille sguaiataggini finirono col dare in una bella risata.
-E risero, risero, risero da doversi reggere il corpo: se non che, sul più bello del ridere, Lucignolo tutt’a un tratto si chetò, e barcollando e cambiando colore, disse all’amico:
-– Aiuto, aiuto, Pinocchio!
-– Che cos’hai?
-– Ohimè. Non mi riesce più di star ritto sulle gambe.
-– Non mi riesce più neanche a me, – gridò Pinocchio, piangendo e traballando.
-E mentre dicevano così, si piegarono tutt’e due carponi a terra e, camminando con le mani e coi piedi, cominciarono a girare e a correre per la stanza. E intanto che correvano, i loro bracci diventarono zampe, i loro visi si allungarono e diventarono musi e le loro schiene si coprirono di un pelame grigiolino chiaro, brizzolato di nero.
-Ma il momento più brutto per que’ due sciagurati sapete quando fu? Il momento più brutto e più umiliante fu quello quando sentirono spuntarsi di dietro la coda. Vinti allora dalla vergogna e dal dolore, si provarono a piangere e a lamentarsi del loro destino.
-Non l’avessero mai fatto! Invece di gemiti e di lamenti, mandavano fuori dei ragli asinini: e ragliando sonoramente, facevano tutt’e due coro: j-a, j-a, j-a.
-In quel frattempo fu bussato alla porta, e una voce di fuori disse:
-– Aprite! Sono l’Omino, sono il conduttore del carro che vi portò in questo paese. Aprite subito, o guai a voi!
-
-XXXIII Diventato un ciuchino vero, è portato a vendere, e lo compra il direttore di una compagnia di pagliacci per insegnargli a ballare e a saltare i cerchi; ma una sera azzoppisce e allora lo ricompra un altro, per far con la sua pelle un tamburo.
-
-Vedendo che la porta non si apriva, l’Omino la spalancò con un violentissimo calcio: ed entrato che fu nella stanza, disse col suo solito risolino a Pinocchio e a Lucignolo:
-– Bravi ragazzi! Avete ragliato bene, e io vi ho subito riconosciuti alla voce. E per questo eccomi qui.
-A tali parole, i due ciuchini rimasero mogi mogi, colla testa giù, con gli orecchi bassi e con la coda fra le gambe.
-Da principio l’Omino li lisciò, li accarezzò, li palpeggiò: poi, tirata fuori la striglia, cominciò a strigliarli perbene.
-E quando a furia di strigliarli, li ebbe fatti lustri come due specchi, allora messe loro la cavezza e li condusse sulla piazza del mercato, con la speranza di venderli e di beccarsi un discreto guadagno.
-E i compratori, difatti, non si fecero aspettare.
-Lucignolo fu comprato da un contadino, a cui era morto il somaro il giorno avanti, e Pinocchio fu venduto al direttore di una compagnia di pagliacci e di saltatori di corda, il quale lo comprò per ammaestrarlo e per farlo poi saltare e ballare insieme con le altre bestie della compagnia.
-E ora avete capito, miei piccoli lettori, qual era il bel mestiere che faceva l’Omino? Questo brutto mostriciattolo, che aveva una fisionomia tutta latte e miele, andava di tanto in tanto con un carro a girare per il mondo: strada facendo raccoglieva con promesse e con moine tutti i ragazzi svogliati, che avevano a noia i libri e le scuole: e dopo averli caricati sul suo carro, li conduceva nel Paese dei Balocchi, perché passassero tutto il loro tempo in giochi, in chiassate e in divertimenti. Quando poi quei poveri ragazzi illusi, a furia di baloccarsi sempre e di non studiare mai, diventavano tanti ciuchini, allora tutto allegro e contento s’impadroniva di loro e li portava a vendere sulle fiere e sui mercati. E così in pochi anni aveva fatto fior di quattrini ed era diventato milionario.
-Quel che accadesse di Lucignolo, non lo so: so, per altro, che Pinocchio andò incontro fin dai primi giorni a una vita durissima e strapazzata.
-Quando fu condotto nella stalla, il nuovo padrone gli empì la greppia di paglia: ma Pinocchio, dopo averne assaggiata una boccata, la risputò.
-Allora il padrone, brontolando, gli empì la greppia di fieno: ma neppure il fieno gli piacque.
-– Ah! non ti piace neppure il fieno? – gridò il padrone imbizzito. – Lascia fare, ciuchino bello, che se hai dei capricci per il capo, penserò io a levarteli!...
-E a titolo di correzione, gli affibbiò subito una frustata nelle gambe.
-Pinocchio dal gran dolore, cominciò a piangere e a ragliare, e ragliando, disse:
-– J-a, j-a, la paglia non la posso digerire!...
-– Allora mangia il fieno! – replicò il padrone che intendeva benissimo il dialetto asinino.
-– J-a, j-a, il fieno mi fa dolere il corpo!...
-– Pretenderesti, dunque, che un somaro, par tuo, lo dovessi mantenere a petti di pollo e cappone in galantina? – soggiunse il padrone arrabbiandosi sempre più e affibbiandogli una seconda frustata.
-A quella seconda frustata Pinocchio, per prudenza, si chetò subito e non disse altro.
-Intanto la stalla fu chiusa e Pinocchio rimase solo: e perché erano molte ore che non aveva mangiato cominciò a sbadigliare dal grande appetito. E, sbadigliando, spalancava una bocca che pareva un forno.
-Alla fine, non trovando altro nella greppia, si rassegnò a masticare un po’ di fieno: e dopo averlo masticato ben bene, chiuse gli occhi e lo tirò giù.
-– Questo fieno non è cattivo, – poi disse dentro di sé, – ma quanto sarebbe stato meglio che avessi continuato a studiare!... A quest’ora, invece di fieno, potrei mangiare un cantuccio di pan fresco e una bella fetta di salame!... Pazienza!
-La mattina dopo, svegliandosi, cercò subito nella greppia un altro po’ di fieno; ma non lo trovò perché l’aveva mangiato tutto nella notte.
-Allora prese una boccata di paglia tritata: ma in quel mentre che la masticava si dové accorgere che il sapore della paglia tritata non somigliava punto né al risotto alla milanese né ai maccheroni alla napoletana.
-– Pazienza! – ripeté, continuando a masticare. – Che almeno la mia disgrazia possa servire di lezione a tutti i ragazzi disobbedienti e che non hanno voglia di studiare. Pazienza!... pazienza!
-– Pazienza un corno! – urlò il padrone, entrando in quel momento nella stalla. – Credi forse, mio bel ciuchino, ch’io ti abbia comprato unicamente per darti da bere e da mangiare? Io ti ho comprato perché tu lavori e perché tu mi faccia guadagnare molti quattrini. Su, dunque, da bravo! Vieni con me nel Circo, e là ti insegnerà a saltare i cerchi, a rompere col capo le botti di foglio e a ballare il valzer e la polca, stando ritto sulle gambe di dietro.
-Il povero Pinocchio, per amore o per forza, dové imparare tutte queste bellissime cose; ma, per impararle, gli ci vollero tre mesi di lezioni, e molte frustate da levare il pelo.
-Venne finalmente il giorno, in cui il suo padrone poté annunziare uno spettacolo veramente straordinario. I cartelloni di vario colore, attaccati alle cantonate delle strade, dicevano così:
-GRANDE
-SPETTACOLO DI GALA
-
-PER QUESTA SERA
-
-AVRANNO LUOGO I SOLITI SALTI ED ESERCIZI SORPRENDENTI ESEGUITI DA TUTTI GLI ARTISTI E DA TUTTI I CAVALLI D’AMBO I SESSI DELLA COMPAGNIA
-
-E PIÙ SARÀ PRESENTATO PER LA PRIMA VOLTA IL FAMOSO
-
-CIUCHINO
-PINOCCHIO
-DETTO
-LA STELLA DELLA DANZA
-
-IL TEATRO SARÀ ILLUMINATO A GIORNO
-Quella sera, come potete figurarvelo, un’ora prima che cominciasse lo spettacolo, il teatro era pieno stipato.
-Non si trovava più né un posto distinto, né un palco, nemmeno a pagarlo a peso d’oro.
-Le gradinate del Circo formicolavano di bambini, di bambine e di ragazzi di tutte le età, che avevano la febbre addosso per la smania di veder ballare il famoso ciuchino Pinocchio.
-Finita la prima parte dello spettacolo, il direttore della compagnia, vestito in giubba nera, calzoni bianchi a coscia e stivaloni di pelle fin sopra ai ginocchi, si presentò all’affollatissimo pubblico, e, fatto un grande inchino, recitò con molta solennità il seguente spropositato discorso:
-«Rispettabile pubblico, cavalieri e dame!»
-«L’umile sottoscritto essendo di passaggio per questa illustre metropolitana, ho voluto procrearmi l’onore nonché il piacere di presentare a questo intelligente e cospicuo uditorio un celebre ciuchino, che ebbe già l’onore di ballare al cospetto di Sua Maestà l’Imperatore di tutte le Corti principali d’Europa.»
-«E col ringraziandoli, aiutateci della vostra animatrice presenza e compatiteci!”
-Questo discorso fu accolto da molte risate e da molti applausi: ma gli applausi raddoppiarono e diventarono una specie di uragano alla comparsa del ciuchino Pinocchio in mezzo al Circo. Egli era tutto agghindato a festa. Aveva una briglia nuova di pelle lustra, con fibbie e borchie d’ottone; due camelie bianche agli orecchi; la criniera divisa in tanti riccioli legati con fiocchettini d’argento attraverso alla vita, e la coda tutta intrecciata con nastri di velluto amaranto e celeste. Era, insomma, un ciuchino da innamorare!
-Il direttore, nel presentarlo al pubblico, aggiunse queste parole:
-«Miei rispettabili auditori! Non starò qui a farvi menzogne delle grandi difficoltà da me soppressate per comprendere e soggiogare questo mammifero, mentre pascolava liberamente di montagna in montagna nelle pianure della zona torrida. Osservate, vi prego, quanta selvaggina trasudi dà suoi occhi, conciossiaché essendo riusciti vanitosi tutti i mezzi per addomesticarlo al vivere dei quadrupedi civili, ho dovuto più volte ricorrere all’affabile dialetto della frusta. Ma ogni mia gentilezza invece di farmi da lui benvolere, me ne ha maggiormente cattivato l’animo. Io però, seguendo il sistema di Galles, trovai nel suo cranio una piccola cartagine ossea che la stessa Facoltà Medicea di Parigi riconobbe essere quello il bulbo rigeneratore dei capelli e della danza pirrica. E per questo io lo volli ammaestrare nel ballo nonché nei relativi salti dei cerchi e delle botti foderate di foglio. Ammiratelo, e poi giudicatelo! Prima però di prendere cognato da voi, permettete, o signori, che io v’inviti al diurno spettacolo di domani sera: ma nell’apoteosi che il tempo piovoso minacciasse acqua, allora lo spettacolo invece di domani sera, sarà posticipato a domattina, alle ore undici antimeridiane del pomeriggio».
-E qui il direttore fece un’altra profondissima riverenza: quindi rivolgendosi a Pinocchio, gli disse:
-– Animo, Pinocchio!... Avanti di dar principio ai vostri esercizi, salutate questo rispettabile pubblico, cavalieri, dame e ragazzi!
-Pinocchio, ubbidiente, piegò subito i due ginocchi davanti, fino a terra, e rimase inginocchiato fino a tanto che il direttore, schioccando la frusta, non gli gridò:
-– Al passo!
-Allora il ciuchino si rizzò sulle quattro gambe, e cominciò a girare intorno al Circo, camminando sempre di passo.
-Dopo un poco il direttore grido:
-– Al trotto! – e Pinocchio, ubbidiente al comando, cambiò il passo in trotto.
-– Al galoppo!... – e Pinocchio staccò il galoppo.
-– Alla carriera! – e Pinocchio si dette a correre di gran carriera.
-Ma in quella che correva come un barbero, il direttore, alzando il braccio in aria, scaricò un colpo di pistola.
-A quel colpo il ciuchino, fingendosi ferito, cadde disteso nel Circo, come se fosse moribondo davvero.
-Rizzatosi da terra, in mezzo a uno scoppio di applausi, d’urli e di battimani, che andavano alle stelle, gli venne naturalmente di alzare la testa e di guardare in su... e guardando, vide in un palco una bella signora, che aveva al collo una grossa collana d’oro, dalla quale pendeva un medaglione.
-Nel medaglione c’era dipinto il ritratto d’un burattino.
-– Quel ritratto è il mio!... quella signora è la Fata! – disse dentro di sé Pinocchio, riconoscendola subito: e lasciandosi vincere dalla gran contentezza, si provò a gridare:
-– Oh Fatina mia! oh Fatina mia!
-Ma invece di queste parole, gli uscì dalla gola un raglio così sonoro e prolungato, che fece ridere tutti gli spettatori, e segnatamente tutti i ragazzi che erano in teatro.
-Allora il direttore, per insegnargli e per fargli intendere che non è buona creanza mettersi a ragliare in faccia al pubblico, gli diè col manico della frusta una bacchettata sul naso.
-Il povero ciuchino, tirato fuori un palmo di lingua, durò a leccarsi il naso almeno cinque minuti, credendo forse così di rasciugarsi il dolore che aveva sentito.
-Ma quale fu la sua disperazione quando, voltandosi in su una seconda volta, vide che il palco era vuoto e che la Fata era sparita!...
-Si sentì come morire: gli occhi gli si empirono di lacrime e cominciò a piangere dirottamente. Nessuno però se ne accorse e, meno degli altri, il direttore, il quale, anzi, schioccando la frusta, gridò:
-– Da bravo, Pinocchio! Ora farete vedere a questi signori con quanta grazia sapete saltare i cerchi.
-Pinocchio si provò due o tre volte: ma ogni volta che arrivava davanti al cerchio, invece di attraversarlo, ci passava più comodamente di sotto. Alla fine spiccò un salto e l’attraversò: ma le gambe di dietro gli rimasero disgraziatamente impigliate nel cerchio: motivo per cui ricadde in terra dall’altra parte tutto in un fascio.
-Quando si rizzò, era azzoppito, e a malapena poté ritornare alla scuderia.
-– Fuori Pinocchio! Vogliamo il ciuchino! Fuori il ciuchino! – gridavano i ragazzi dalla platea, impietositi e commossi al tristissimo caso.
-Ma il ciuchino per quella sera non si fece rivedere.
-La mattina dopo il veterinario, ossia il medico delle bestie, quando l’ebbe visitato, dichiarò che sarebbe rimasto zoppo per tutta la vita.
-Allora il direttore disse al suo garzone di stalla:
-– Che vuoi tu che mi faccia d’un somaro zoppo? Sarebbe un mangiapane a ufo. Portalo dunque in piazza e rivendilo.
-Arrivati in piazza, trovarono subito il compratore, il quale domandò al garzone di stalla:
-– Quanto vuoi di cotesto ciuchino zoppo?
-– Venti lire.
-– Io ti do venti soldi. Non credere che io lo compri per servirmene: lo compro unicamente per la sua pelle. Vedo che ha la pelle molto dura, e con la sua pelle voglio fare un tamburo per la banda musicale del mio paese.
-Lascio pensare a voi, ragazzi, il bel piacere che fu per il povero Pinocchio, quando sentì che era destinato a diventare un tamburo!
-Fatto sta che il compratore, appena pagati i venti soldi, condusse il ciuchino sopra uno scoglio ch’era sulla riva del mare; e messogli un sasso al collo e legatolo per una zampa con una fune che teneva in mano, gli diè improvvisamente uno spintone e lo gettò nell’acqua.
-Pinocchio, con quel macigno al collo, andò subito a fondo; e il compratore, tenendo sempre stretta in mano la fune, si pose a sedere sullo scoglio, aspettando che il ciuchino avesse tutto il tempo di morire affogato, per poi levargli la pelle.
-
-XXXIV Pinocchio, gettato in mare, è mangiato dai pesci e ritorna ad essere un burattino come prima; ma mentre nuota per salvarsi, è ingoiato dal terribile Pesce-cane.
-
-Dopo cinquanta minuti che il ciuchino era sott’acqua, il compratore disse, discorrendo da sé solo:
-– A quest’ora il mio povero ciuchino zoppo deve essere bell’affogato. Ritiriamolo dunque su, e facciamo con la sua pelle questo bel tamburo.
-E cominciò a tirare la fune, con la quale lo aveva legato per una gamba: e tira, tira, tira, alla fine vide apparire a fior d’acqua... indovinate? Invece di un ciuchino morto, vide apparire a fior d’acqua un burattino vivo che scodinzolava come un’anguilla.
-Vedendo quel burattino di legno, il pover’uomo credé di sognare e rimase lì intontito, a bocca aperta e con gli occhi fuori della testa.
-Riavutosi un poco dal suo primo stupore, disse piangendo e balbettando:
-– E il ciuchino che ho gettato in mare dov’è?
-– Quel ciuchino son io! – rispose il burattino, ridendo.
-– Tu?
-– Io.
-– Ah! mariuolo! Pretenderesti forse burlarti di me?
-– Burlarmi di voi? Tutt’altro, caro padrone: io vi parlo sul serio.
-– Ma come mai tu, che poco fa eri un ciuchino, ora, stando nell’acqua sei diventato un burattino di legno?...
-– Sarà effetto dell’acqua del mare. Il mare ne fa di questi scherzi.
-– Bada, burattino, bada!... Non credere di divertirti alle mie spalle. Guai a te, se mi scappa la pazienza.
-– Ebbene, padrone: volete sapere tutta la vera storia? Scioglietemi questa gamba e io ve la racconterò.
-Quel buon pasticcione del compratore, curioso di conoscere la vera storia, gli sciolse subito il nodo della fune, che lo teneva legato: e allora Pinocchio, trovandosi libero come un uccello nell’aria prese a dirgli così:
-– Sappiate dunque che io ero un burattino di legno come sono oggi: ma mi trovavo a tocco e non tocco di diventare un ragazzo, come in questo mondo ce n’è tanti: se non che per la mia poca voglia di studiare e per dar retta ai cattivi compagni, scappai di casa... e un bel giorno, svegliandomi, mi trovai cambiato in un somaro con tanto di orecchi... e con tanto di coda!... Che vergogna fu quella per me!... Una vergogna, caro padrone, che Sant’Antonio benedetto non la faccia provare neppure a voi! Portato a vendere sul mercato degli asini, fui comprato dal Direttore di una compagnia equestre, il quale si messe in capo di far di me un gran ballerino e un gran saltatore di cerchi; ma una sera durante lo spettacolo, feci in teatro una brutta cascata, e rimasi zoppo da tutt’e due le gambe. Allora il direttore non sapendo che cosa farsi d’un asino zoppo, mi mandò a rivendere, e voi mi avete comprato!
-– Pur troppo! E ti ho pagato venti soldi. E ora chi mi rende i miei poveri venti soldi?
-– E perché mi avete comprato? Voi mi avete comprato per fare con la mia pelle un tamburo!... un tamburo!...
-– Pur troppo!... E ora dove troverò un’altra pelle?
-– Non vi date alla disperazione, padrone. Dei ciuchini ce n’è tanti, in questo mondo!
-– Dimmi, monello impertinente: e la tua storia finisce qui?
-– No, – rispose il burattino, – ci sono altre due parole, e poi è finita. Dopo avermi comprato, mi avete condotto in questo luogo per uccidermi; ma poi, cedendo a un sentimento pietoso d’umanità, avete preferito di legarmi un sasso al collo e di gettarmi in fondo al mare. Questo sentimento di delicatezza vi onora moltissimo, e io ve ne serberò eterna riconoscenza. Per altro, caro padrone, questa volta avete fatto i vostri conti senza la Fata...
-– E chi è questa Fata?
-– È la mia mamma, la quale somiglia a tutte quelle buone mamme, che vogliono un gran bene ai loro ragazzi e non li perdono mai d’occhio, e li assistono amorosamente in ogni disgrazia, anche quando questi ragazzi, per le loro scapataggini e per i loro cattivi portamenti, meriterebbero di essere abbandonati e lasciati in balia a se stessi. Dicevo, dunque, che la buona Fata, appena mi vide in pericolo di affogare, mandò subito intorno a me un branco infinito di pesci, i quali credendomi davvero un ciuchino bell’e morto, cominciarono a mangiarmi! E che bocconi che facevano! Non avrei mai creduto che i pesci fossero più ghiotti anche dei ragazzi! Chi mi mangiò gli orecchi, chi mi mangiò il muso, chi il collo e la criniera, chi la pelle delle zampe, chi la pelliccia della schiena... e fra gli altri, vi fu un pesciolino così garbato, che si degnò perfino di mangiarmi la coda.
-– Da oggi in poi, – disse il compratore inorridito, – faccio giuro di non assaggiar più carne di pesce. Mi dispiacerebbe troppo di aprire una triglia o un nasello fritto e di trovargli in corpo una coda di ciuco!
-– Io la penso come voi, – replicò il burattino, ridendo. – Del resto, dovete sapere che quando i pesci ebbero finito di mangiarmi tutta quella buccia asinina, che mi copriva dalla testa ai piedi, arrivarono, – com’è naturale, all’osso... o per dir meglio, arrivarono al legno, perché, come vedete, io son fatto di legno durissimo. Ma dopo dati i primi morsi, quei pesci ghiottoni si accorsero subito che il legno non era ciccia per i loro denti, e nauseati da questo cibo indigesto se ne andarono chi in qua chi in là, senza voltarsi nemmeno a dirmi grazie... Ed eccovi raccontato come qualmente voi, tirando su la fune, avete trovato un burattino vivo, invece d’un ciuchino morto.
-– Io mi rido della tua storia, – gridò il compratore imbestialito. – Io so che ho speso venti soldi per comprarti, e rivoglio i miei quattrini. Sai che cosa farò? Ti porterò daccapo al mercato, e ti rivenderò a peso di legno stagionato per accendere il fuoco nel caminetto.
-– Rivendetemi pure: io sono contento, – disse Pinocchio.
-Ma nel dir così, fece un bel salto e schizzò in mezzo all’acqua. E nuotando allegramente e allontanandosi dalla spiaggia, gridava al povero compratore:
-– Addio, padrone; se avete bisogno di una pelle per fare un tamburo, ricordatevi di me.
-E poi rideva e seguitava a nuotare: e dopo un poco, rivoltandosi indietro, urlava più forte:
-– Addio, padrone: se avete bisogno di un po’ di legno stagionato, per accendere il caminetto, ricordatevi di me.
-Fatto sta che in un batter d’occhio si era tanto allontanato, che non si vedeva quasi più: ossia, si vedeva solamente sulla superficie del mare un puntolino nero, che di tanto in tanto rizzava le gambe fuori dell’acqua e faceva capriole e salti, come un delfino in vena di buonumore.
-Intanto che Pinocchio nuotava alla ventura, vide in mezzo al mare uno scoglio che pareva di marmo bianco: e su in cima allo scoglio, una bella Caprettina che belava amorosamente e gli faceva segno di avvicinarsi.
-La cosa più singolare era questa: che la lana della Caprettina, invece di esser bianca, o nera, o pallata di due colori, come quella delle altre capre, era invece turchina, ma d’un color turchino sfolgorante, che rammentava moltissimo i capelli della bella Bambina.
-Lascio pensare a voi se il cuore del povero Pinocchio cominciò a battere più forte! Raddoppiando di forza e di energia si diè a nuotare verso lo scoglio bianco: ed era già a mezza strada, quando ecco uscir fuori dall’acqua e venirgli incontro una orribile testa di mostro marino, con la bocca spalancata, come una voragine, e tre filari di zanne che avrebbero fatto paura anche a vederle dipinte.
-E sapete chi era quel mostro marino?
-Quel mostro marino era né più né meno quel gigantesco Pesce-cane, ricordato più volte in questa storia, e che per le sue stragi e per la sua insaziabile voracità, veniva soprannominato «l’Attila dei pesci e dei pescatori».
-Immaginatevi lo spavento del povero Pinocchio alla vista del mostro. Cercò di scansarlo, di cambiare strada: cercò di fuggire: ma quella immensa bocca spalancata gli veniva sempre incontro con la velocità di una saetta.
-– Affréttati, Pinocchio, per carità! – gridava belando la bella Caprettina.
-E Pinocchio nuotava disperatamente con le braccia, col petto, con le gambe e coi piedi.
-– Corri, Pinocchio, perché il mostro si avvicina!
-E Pinocchio, raccogliendo tutte le sue forze, raddoppiava di lena nella corsa.
-– Bada, Pinocchio!... il mostro ti raggiunge!... Eccolo!... Eccolo!... Affréttati per carità, o sei perduto!...
-E Pinocchio a nuotar più lesto che mai, e via, e via, e via, come andrebbe una palla di fucile. E già era presso lo scoglio, e già la Caprettina, spenzolandosi tutta sul mare, gli porgeva le sue zampine davanti per aiutarlo a uscire dall’acqua!
-Ma oramai era tardi! Il mostro lo aveva raggiunto: il mostro, tirando il fiato a sé, si bevve il povero burattino, come avrebbe bevuto un uovo di gallina: e lo inghiottì con tanta violenza e con tanta avidità, che Pinocchio, cascando giù in corpo al Pesce-cane, batté un colpo così screanzato, da restarne sbalordito per un quarto d’ora.
-Quando ritornò in sé da quello sbigottimento, non sapeva raccapezzarsi, nemmeno lui, in che mondo si fosse. Intorno a sé c’era da ogni parte un gran buio: ma un buio così nero e profondo, che gli pareva di essere entrato col capo in un calamaio pieno d’inchiostro. Stette in ascolto e non senti nessun rumore: solamente di tanto in tanto sentiva battersi nel viso alcune grandi buffate di vento. Da principio non sapeva intendere da dove quel vento uscisse: ma poi capì che usciva dai polmoni del mostro. Perché bisogna sapere che il Pesce-cane soffriva moltissimo d’asma, e quando respirava, pareva proprio che tirasse la tramontana.
-Pinocchio, sulle prime, s’ingegnò di farsi un poco di coraggio: ma quand’ebbe la prova e la riprova di trovarsi chiuso in corpo al mostro marino allora cominciò a piangere e a strillare: e piangendo diceva:
-– Aiuto! aiuto! Oh povero me! Non c’è nessuno che venga a salvarmi?
-– Chi vuoi che ti salvi, disgraziato?... – disse in quel buio una vociaccia fessa di chitarra scordata.
-– Chi è che parla così? – domandò Pinocchio, sentendosi gelare dallo spavento.
-– Sono io! sono un povero Tonno, inghiottito dal Pesce-cane insieme con te. E tu che pesce sei?
-– Io non ho che vedere nulla coi pesci. Io sono un burattino.
-– E allora, se non sei un pesce, perché ti sei fatto inghiottire dal mostro?
-– Non son io, che mi son fatto inghiottire: gli è lui che mi ha inghiottito! Ed ora che cosa dobbiamo fare qui al buio?...
-– Rassegnarsi e aspettare che il Pesce-cane ci abbia digeriti tutt’e due!...
-– Ma io non voglio esser digerito! – urlò Pinocchio, ricominciando a piangere.
-– Neppure io vorrei esser digerito, – soggiunse il Tonno, – ma io sono abbastanza filosofo e mi consolo pensando che, quando si nasce Tonni, c’è più dignità a morir sott’acqua che sott’olio!...
-– Scioccherie! – gridò Pinocchio.
-– La mia è un’opinione, – replicò il Tonno, – e le opinioni, come dicono i Tonni politici, vanno rispettate!
-– Insomma... io voglio andarmene di qui... io voglio fuggire...
-– Fuggi, se ti riesce!...
-– È molto grosso questo Pesce-cane che ci ha inghiottiti? – domandò il burattino.
-– Figùrati che il suo corpo è più lungo di un chilometro, senza contare la coda.
-Nel tempo che facevano questa conversazione al buio, parve a Pinocchio di veder lontan lontano una specie di chiarore.
-– Che cosa sarà mai quel lumicino lontano lontano? – disse Pinocchio.
-– Sarà qualche nostro compagno di sventura, che aspetterà come noi il momento di esser digerito!....
-– Voglio andare a trovarlo. Non potrebbe darsi il caso che fosse qualche vecchio pesce capace di insegnarmi la strada per fuggire?
-– Io te l’auguro di cuore, caro burattino.
-– Addio, Tonno.
-– Addio, burattino; e buona fortuna.
-– Dove ci rivedremo?...
-– Chi lo sa?... è meglio non pensarci neppure!
-
-XXXV Pinocchio ritrova in corpo al Pesce-cane... Chi ritrova? Leggete questo capitolo e lo saprete.
-
-Pinocchio, appena che ebbe detto addio al suo buon amico Tonno, si mosse brancolando in mezzo a quel buio, e cominciò a camminare a tastoni dentro il corpo del Pesce-cane, avviandosi un passo dietro l’altro verso quel piccolo chiarore che vedeva baluginare lontano lontano.
-E nel camminare sentì che i suoi piedi sguazzavano in una pozzanghera d’acqua grassa e sdrucciolona, e quell’acqua sapeva di un odore così acuto di pesce fritto che gli pareva di essere a mezza quaresima.
-E più andava avanti, e più il chiarore si faceva rilucente e distinto: finché, cammina cammina, alla fine arrivò: e quando fu arrivato... che cosa trovò? Ve lo do a indovinare in mille: trovò una piccola tavola apparecchiata, con sopra una candela accesa infilata in una bottiglia di cristallo verde, e seduto a tavola un vecchiettino tutto bianco, come se fosse di neve o di panna montata, il quale se ne stava lì biascicando alcuni pesciolini vivi, ma tanto vivi, che alle volte mentre li mangiava, gli scappavano perfino di bocca.
-A quella vista il povero Pinocchio ebbe un’allegrezza così grande e così inaspettata, che ci mancò un ette non cadesse in delirio. Voleva ridere, voleva piangere, voleva dire un monte di cose; e invece mugolava confusamente e balbettava delle parole tronche e sconclusionate. Finalmente gli riuscì di cacciar fuori un grido di gioia e spalancando le braccia e gettandosi al collo del vecchietto, cominciò a urlare:
-– Oh! babbino mio! finalmente vi ho ritrovato! Ora poi non vi lascio più, mai più, mai più!
-– Dunque gli occhi mi dicono il vero? – replicò il vecchietto stropicciandosi gli occhi, – Dunque tu sé proprio il mi’ caro Pinocchio?
-– Sì, sì, sono io, proprio io! E voi mi avete digià perdonato, non è vero? Oh! babbino mio, come siete buono!... e pensare che io, invece... Oh! ma se sapeste quante disgrazie mi son piovute sul capo e quante cose mi son andate per traverso! Figuratevi che il giorno che voi, povero babbino, col vendere la vostra casacca mi compraste l’Abbecedario per andare a scuola, io scappai a vedere i burattini, e il burattinaio mi voleva mettere sul fuoco perché gli cocessi il montone arrosto, che fu quello poi che mi dette cinque monete d’oro, perché le portassi a voi, ma io trovai la Volpe e il Gatto, che mi condussero all’osteria del Gambero Rosso dove mangiarono come lupi, e partito solo di notte incontrai gli assassini che si messero a corrermi dietro, e io via, e loro dietro, e io via e loro sempre dietro, e io via, finché m’impiccarono a un ramo della Quercia grande, dovecché la bella Bambina dai capelli turchini mi mandò a prendere con una carrozzina, e i medici, quando m’ebbero visitato, dissero subito: «Se non è morto, è segno che è sempre vivo», e allora mi scappò detto una bugia, e il naso cominciò a crescermi e non mi passava più dalla porta di camera, motivo per cui andai con la Volpe e col Gatto a sotterrare le quattro monete d’oro, che una l’avevo spesa all’osteria, e il pappagallo si messe a ridere, e viceversa di duemila monete non trovai più nulla, la quale il giudice quando seppe che ero stato derubato, mi fece subito mettere in prigione, per dare una soddisfazione ai ladri, di dove, col venir via, vidi un bel grappolo d’uva in un campo, che rimasi preso alla tagliola e il contadino di santa ragione mi messe il collare da cane perché facessi la guardia al pollaio, che riconobbe la mia innocenza e mi lasciò andare, e il Serpente, colla coda che gli fumava, cominciò a ridere e gli si strappò una vena sul petto e così ritornai alla Casa della bella Bambina, che era morta, e il Colombo vedendo che piangevo mi disse: «Ho visto il tu’ babbo che si fabbricava una barchettina per venirti a cercare», e io gli dissi: «Oh! se avessi l’ali anch’io», e lui mi disse: «Vuoi venire dal tuo babbo?», e io gli dissi: «Magari! ma chi mi ci porta», e lui mi disse: «Ti ci porto io», e io gli dissi: «Come?», e lui mi disse: «Montami sulla groppa», e così abbiamo volato tutta la notte, e poi la mattina tutti i pescatori che guardavano verso il mare mi dissero: «C’è un pover’uomo in una barchetta che sta per affogare», e io da lontano vi riconobbi subito, perché me lo diceva il core, e vi feci cenno di tornare alla spiaggia...
-– Ti riconobbi anch’io, – disse Geppetto, – e sarei volentieri tornato alla spiaggia: ma come fare? Il mare era grosso e un cavallone m’arrovesciò la barchetta. Allora un orribile Pesce-cane che era lì vicino, appena m’ebbe visto nell’acqua corse subito verso di me, e tirata fuori la lingua, mi prese pari pari, e m’inghiottì come un tortellino di Bologna.
-– E quant’è che siete chiuso qui dentro? – domandò Pinocchio.
-– Da quel giorno in poi, saranno oramai due anni: due anni, Pinocchio mio, che mi son parsi due secoli!
-– E come avete fatto a campare? E dove avete trovata la candela? E i fiammiferi per accenderla, chi ve li ha dati?
-– Ora ti racconterò tutto. Devi dunque sapere che quella medesima burrasca, che rovesciò la mia barchetta, fece anche affondare un bastimento mercantile. I marinai si salvarono tutti, ma il bastimento colò a fondo e il solito Pesce-cane, che quel giorno aveva un appetito eccellente, dopo aver inghiottito me, inghiottì anche il bastimento...
-– Come? Lo inghiottì tutto in un boccone?... – domandò Pinocchio maravigliato.
-– Tutto in un boccone: e risputò solamente l’albero maestro, perché gli era rimasto fra i denti come una lisca. Per mia gran fortuna, quel bastimento era carico di carne conservata in cassette di stagno, di biscotto, ossia di pane abbrostolito, di bottiglie di vino, d’uva secca, di cacio, di caffè, di zucchero, di candele steariche e di scatole di fiammiferi di cera. Con tutta questa grazia di Dio ho potuto campare due anni: ma oggi sono agli ultimi sgoccioli: oggi nella dispensa non c’è più nulla, e questa candela, che vedi accesa, è l’ultima candela che mi sia rimasta...
-– E dopo?...
-– E dopo, caro mio, rimarremo tutt’e due al buio.
-– Allora, babbino mio, – disse Pinocchio, – non c’è tempo da perdere. Bisogna pensar subito a fuggire...
-– A fuggire?... e come?
-– Scappando dalla bocca del Pesce-cane e gettandosi a nuoto in mare.
-– Tu parli bene: ma io, caro Pinocchio, non so nuotare.
-– E che importa?... Voi mi monterete a cavalluccio sulle spalle e io, che sono un buon nuotatore, vi porterò sano e salvo fino alla spiaggia.
-– Illusioni, ragazzo mio! – replicò Geppetto, scotendo il capo e sorridendo malinconicamente. – Ti par egli possibile che un burattino, alto appena un metro, come sei tu, possa aver tanta forza da portarmi a nuoto sulle spalle?
-– Provatevi e vedrete! A ogni modo, se sarà scritto in cielo che dobbiamo morire, avremo almeno la gran consolazione di morire abbracciati insieme.
-E senza dir altro, Pinocchio prese in mano la candela, e andando avanti per far lume, disse al suo babbo:
-– Venite dietro a me, e non abbiate paura. E così camminarono un bel pezzo, e traversarono tutto il corpo e tutto lo stomaco del Pesce-cane. Ma giunti che furono al punto dove cominciava la gran gola del mostro, pensarono bene di fermarsi per dare un’occhiata e cogliere il momento opportuno alla fuga.
-Ora bisogna sapere che il Pesce-cane, essendo molto vecchio e soffrendo d’asma e di palpitazione di cuore, era costretto a dormir a bocca aperta: per cui Pinocchio, affacciandosi al principio della gola e guardando in su, poté vedere al di fuori di quell’enorme bocca spalancata un bel pezzo di cielo stellato e un bellissimo lume di luna.
-– Questo è il vero momento di scappare, – bisbigliò allora voltandosi al suo babbo. – Il Pescecane dorme come un ghiro: il mare è tranquillo e ci si vede come di giorno. Venite dunque, babbino, dietro a me e fra poco saremo salvi.
-Detto fatto, salirono su per la gola del mostro marino, e arrivati in quell’immensa bocca cominciarono a camminare in punta di piedi sulla lingua; una lingua così larga e così lunga, che pareva il viottolone d’un giardino. E già stavano lì lì per fare il gran salto e per gettarsi a nuoto nel mare, quando, sul più bello, il Pesce-cane starnutì, e nello starnutire, dette uno scossone così violento, che Pinocchio e Geppetto si trovarono rimbalzati all’indietro e scaraventati novamente in fondo allo stomaco del mostro.
-Nel grand’urto della caduta la candela si spense, e padre e figliuolo rimasero al buio.
-– E ora?... – domandò Pinocchio facendosi serio.
-– Ora ragazzo mio, siamo bell’e perduti.
-– Perché perduti? Datemi la mano, babbino, e badate di non sdrucciolare!...
-– Dove mi conduci?
-– Dobbiamo ritentare la fuga. Venite con me e non abbiate paura.
-Ciò detto, Pinocchio prese il suo babbo per la mano: e camminando sempre in punta di piedi, risalirono insieme su per la gola del mostro: poi traversarono tutta la lingua e scavalcarono i tre filari di denti. Prima però di fare il gran salto, il burattino disse al suo babbo:
-– Montatemi a cavalluccio sulle spalle e abbracciatemi forte forte. Al resto ci penso io.
-Appena Geppetto si fu accomodato per bene sulle spalle del figliuolo, Pinocchio, sicurissimo del fatto suo, si gettò nell’acqua e cominciò a nuotare. Il mare era tranquillo come un olio: la luna splendeva in tutto il suo chiarore e il Pesce-cane seguitava a dormire di un sonno così profondo, che non l’avrebbe svegliato nemmeno una cannonata.
-
-XXXVI Finalmente Pinocchio cessa d’essere un burattino e diventa un ragazzo.
-
-Mentre Pinocchio nuotava alla svelta per raggiungere la spiaggia, si accorse che il suo babbo, il quale gli stava a cavalluccio sulle spalle e aveva le gambe mezze nell’acqua, tremava fitto fitto, come se al pover’uomo gli battesse la febbre terzana.
-Tremava di freddo o di paura? Chi lo sa? Forse un po’ dell’uno e un po’ dell’altro. Ma Pinocchio, credendo che quel tremito fosse di paura, gli disse per confortarlo:
-– Coraggio babbo! Fra pochi minuti arriveremo a terra e saremo salvi.
-– Ma dov’è questa spiaggia benedetta? – domandò il vecchietto diventando sempre più inquieto, e appuntando gli occhi, come fanno i sarti quando infilano l’ago. – Eccomi qui, che guardo da tutte le parti, e non vedo altro che cielo e mare.
-– Ma io vedo anche la spiaggia, – disse il burattino. – Per vostra regola io sono come i gatti: ci vedo meglio di notte che di giorno.
-Il povero Pinocchio faceva finta di essere di buonumore: ma invece... Invece cominciava a scoraggiarsi: le forze gli scemavano, il suo respiro diventava grosso e affannoso... insomma non ne poteva più, la spiaggia era sempre lontana.
-Nuotò finché ebbe fiato: poi si voltò col capo verso Geppetto, e disse con parole interrotte:
-– Babbo mio, aiutatemi... perché io muoio!
-E il padre e il figliuolo erano oramai sul punto di affogare, quando udirono una voce di chitarra scordata che disse:
-– Chi è che muore?
-– Sono io e il mio povero babbo!...
-– Questa voce la riconosco! Tu sei Pinocchio!...
-– Preciso: e tu?
-– Io sono il Tonno, il tuo compagno di prigionia in corpo al Pesce-cane.
-– E come hai fatto a scappare?
-– Ho imitato il tuo esempio. Tu sei quello che mi hai insegnato la strada, e dopo te, sono fuggito anch’io.
-– Tonno mio, tu càpiti proprio a tempo! Ti prego per l’amor che porti ai Tonnini tuoi figliuoli: aiutaci, o siamo perduti.
-– Volentieri e con tutto il cuore. Attaccatevi tutt’e due alla mia coda, e lasciatevi guidare. In quattro minuti vi condurrò alla riva.
-Geppetto e Pinocchio, come potete immaginarvelo accettarono subito l’invito: ma invece di attaccarsi alla coda, giudicarono più comodo di mettersi addirittura a sedere sulla groppa del Tonno.
-– Siamo troppo pesi?... – gli domandò Pinocchio.
-– Pesi? Neanche per ombra; mi par di avere addosso due gusci di conchiglia, – rispose il Tonno, il quale era di una corporatura così grossa e robusta, da parere un vitello di due anni.
-Giunti alla riva, Pinocchio saltò a terra il primo, per aiutare il suo babbo a fare altrettanto; poi si voltò al Tonno, e con voce commossa gli disse:
-– Amico mio, tu hai salvato il mio babbo! Dunque non ho parole per ringraziarti abbastanza! Permetti almeno che ti dia un bacio in segno di riconoscenza eterna!...
-Il Tonno cacciò il muso fuori dall’acqua, e Pinocchio, piegandosi coi ginocchi a terra, gli posò un affettuosissimo bacio sulla bocca. A questo tratto di spontanea e vivissima tenerezza, il povero Tonno, che non c’era avvezzo, si sentì talmente commosso, che vergognandosi a farsi veder piangere come un bambino, ricacciò il capo sott’acqua e sparì.
-Intanto s’era fatto giorno.
-Allora Pinocchio, offrendo il suo braccio a Geppetto, che aveva appena il fiato di reggersi in piedi, gli disse:
-– Appoggiatevi pure al mio braccio, caro babbino, e andiamo. Cammineremo pian pianino come le formicole, e quando saremo stanchi ci riposeremo lungo la via.
-– E dove dobbiamo andare? – domandò Geppetto.
-– In cerca di una casa o d’una capanna, dove ci diano per carità un boccon di pane e un po’ di paglia che ci serva da letto.
-Non avevano ancora fatti cento passi, che videro seduti sul ciglione della strada due brutti ceffi, i quali stavano lì in atto di chiedere l’elemosina.
-Erano il Gatto e la Volpe: ma non si riconoscevano più da quelli d’una volta. Figuratevi che il Gatto, a furia di fingersi cieco, aveva finito coll’accecare davvero: e la Volpe invecchiata, intignata e tutta perduta da una parte, non aveva più nemmeno la coda. Così è. Quella trista ladracchiola, caduta nella più squallida miseria, si trovò costretta un bel giorno a vendere perfino la sua bellissima coda a un merciaio ambulante, che la comprò per farsene uno scacciamosche.
-– O Pinocchio, – gridò la Volpe con voce di piagnisteo, – fai un po’ di carità a questi due poveri infermi.
-– Infermi! – ripeté il Gatto.
-– Addio, mascherine! – rispose il burattino. – Mi avete ingannato una volta, e ora non mi ripigliate più.
-– Credilo, Pinocchio, che oggi siamo poveri e disgraziati davvero!
-– Davvero! – ripeté il Gatto.
-– Se siete poveri, ve lo meritate. Ricordatevi del proverbio che dice: «I quattrini rubati non fanno mai frutto». Addio, mascherine!
-– Abbi compassione di noi!...
-– Di noi!...
-– Addio, mascherine! Ricordatevi del proverbio che dice: «La farina del diavolo va tutta in crusca».
-– Non ci abbandonare!...
-– ...are! - ripeté il Gatto.
-– Addio, mascherine! Ricordatevi del proverbio che dice: «Chi ruba il mantello al suo prossimo, per il solito muore senza camicia».
-E così dicendo, Pinocchio e Geppetto seguitarono tranquillamente per la loro strada: finché, fatti altri cento passi, videro in fondo a una viottola in mezzo ai campi una bella capanna tutta di paglia, e col tetto coperto d’embrici e di mattoni.
-– Quella capanna dev’essere abitata da qualcuno, – disse Pinocchio. – Andiamo là e bussiamo.
-Difatti andarono, e bussarono alla porta.
-– Chi è? – disse una vocina di dentro.
-– Siamo un povero babbo e un povero figliuolo, senza pane e senza tetto, – rispose il burattino.
-– Girate la chiave, e la porta si aprirà, – disse la solita vocina.
-Pinocchio girò la chiave, e la porta si apri. Appena entrati dentro, guardarono di qua, guardarono di là, e non videro nessuno.
-– O il padrone della capanna dov’è? – disse Pinocchio maravigliato.
-– Eccomi quassù!
-Babbo e figliuolo si voltarono subito verso il soffitto, e videro sopra un travicello il Grillo-parlante:
-– Oh! mio caro Grillino, – disse Pinocchio salutandolo garbatamente.
-– Ora mi chiami il «tuo caro Grillino», non è vero? Ma ti rammenti di quando, per scacciarmi di casa tua, mi tirasti un martello di legno?...
-– Hai ragione, Grillino! Scaccia anche me... tira anche a me un martello di legno: ma abbi pietà del mio povero babbo...
-– Io avrò pietà del babbo e anche del figliuolo: ma ho voluto rammentarti il brutto garbo ricevuto, per insegnarti che in questo mondo, quando si può, bisogna mostrarsi cortesi con tutti, se vogliamo esser ricambiati con pari cortesia nei giorni del bisogno.
-– Hai ragione, Grillino, hai ragione da vendere e io terrò a mente la lezione che mi hai data. Ma mi dici come hai fatto a comprarti questa bella capanna?
-– Questa capanna mi è stata regalata ieri da una graziosa capra, che aveva la lana d’un bellissimo colore turchino.
-– E la capra dov’è andata? – domandò Pinocchio con vivissima curiosità.
-– Non lo so.
-– E quando ritornerà?...
-– Non ritornerà mai. Ieri è partita tutta afflitta, e, belando, pareva che dicesse: “Povero Pinocchio... oramai non lo rivedrò più... il Pesce-cane a quest’ora l’avrà bell’e divorato!...”.
-– Ha detto proprio così?... Dunque era lei!... Era lei!... era la mia cara Fatina!... – cominciò a urlare Pinocchio, singhiozzando e piangendo dirottamente.
-Quand’ebbe pianto ben bene, si rasciugò gli occhi e, preparato un buon lettino di paglia, vi distese sopra il vecchio Geppetto. Poi domandò al Grillo-parlante:
-– Dimmi, Grillino: dove potrei trovare un bicchiere di latte per il mio povero babbo?
-– Tre campi distante di qui c’è l’ortolano Giangio, che tiene le mucche. Và da lui e troverai il latte, che cerchi.
-Pinocchio andò di corsa a casa dell’ortolano Giangio; ma l’ortolano gli disse:
-– Quanto ne vuoi del latte?
-– Ne voglio un bicchiere pieno.
-– Un bicchiere di latte costa un soldo. Comincia intanto dal darmi il soldo.
-– Non ho nemmeno un centesimo, – rispose Pinocchio tutto mortificato e dolente.
-– Male, burattino mio, – replicò l’ortolano. – Se tu non hai nemmeno un centesimo, io non ho nemmeno un dito di latte.
-– Pazienza! – disse Pinocchio e fece l’atto di andarsene.
-– Aspetta un po’, – disse Giangio. – Fra te e me ci possiamo accomodare. Vuoi adattarti a girare il bindolo?
-– Che cos’è il bindolo?
-– Gli è quell’ordigno di legno, che serve a tirar su l’acqua dalla cisterna, per annaffiare gli ortaggi.
-– Mi proverò...
-– Dunque, tirami su cento secchie d’acqua e io ti regalerò in compenso un bicchiere di latte.
-– Sta bene.
-Giangio condusse il burattino nell’orto e gl’insegnò la maniera di girare il bindolo. Pinocchio si pose subito al lavoro; ma prima di aver tirato su le cento secchie d’acqua, era tutto grondante di sudore dalla testa ai piedi. Una fatica a quel modo non l’aveva durata mai.
-– Finora questa fatica di girare il bindolo, – disse l’ortolano, – l’ho fatta fare al mio ciuchino: ma oggi quel povero animale è in fin di vita.
-– Mi menate a vederlo? – disse Pinocchio.
-– Volentieri.
-Appena che Pinocchio fu entrato nella stalla vide un bel ciuchino disteso sulla paglia, rifinito dalla fame e dal troppo lavoro.
-Quando l’ebbe guardato fisso fisso, disse dentro di sé, turbandosi:
-– Eppure quel ciuchino lo conosco! Non mi è fisonomia nuova!
-E chinatosi fino a lui, gli domandò in dialetto asinino:
-– Chi sei?
-A questa domanda, il ciuchino apri gli occhi moribondi, e rispose balbettando nel medesimo dialetto:
-– Sono Lu...ci...gno...lo.
-E dopo richiuse gli occhi e spirò.
-– Oh! povero Lucignolo! – disse Pinocchio a mezza voce: e presa una manciata di paglia, si rasciugò una lacrima che gli colava giù per il viso.
-– Ti commovi tanto per un asino che non ti costa nulla? – disse l’ortolano. – Che cosa dovrei far io che lo comprai a quattrini contanti?
-– Vi dirò... era un mio amico!...
-– Tuo amico?
-– Un mio compagno di scuola!...
-– Come?! – urlò Giangio dando in una gran risata. – Come?! avevi dei somari per compagni di scuola!... Figuriamoci i belli studi che devi aver fatto!...
-Il burattino, sentendosi mortificato da quelle parole, non rispose: ma prese il suo bicchiere di latte quasi caldo, e se ne tornò alla capanna.
-E da quel giorno in poi, continuò più di cinque mesi a levarsi ogni mattina, prima dell’alba, per andare a girare il bindolo, e guadagnare così quel bicchiere di latte, che faceva tanto bene alla salute cagionosa del suo babbo. Né si contentò di questo: perché a tempo avanzato, imparò a fabbricare anche i canestri e i panieri di giunco: e coi quattrini che ne ricavava, provvedeva con moltissimo giudizio a tutte le spese giornaliere. Fra le altre cose, costruì da sé stesso un elegante carrettino per condurre a spasso il suo babbo alle belle giornate, e per fargli prendere una boccata d’aria.
-Nelle veglie poi della sera, si esercitava a leggere e a scrivere. Aveva comprato nel vicino paese per pochi centesimi un grosso libro, al quale mancavano il frontespizio e l’indice, e con quello faceva la sua lettura. Quanto allo scrivere, si serviva di un fuscello temperato a uso penna; e non avendo né calamaio né inchiostro, lo intingeva in una boccettina ripiena di sugo di more e di ciliege.
-Fatto sta, che con la sua buona volontà d’ingegnarsi, di lavorare e di tirarsi avanti, non solo era riuscito a mantenere quasi agiatamente il suo genitore sempre malaticcio, ma per di più aveva potuto mettere da parte anche quaranta soldi per comprarsi un vestitino nuovo.
-Una mattina disse a suo padre:
-– Vado qui al mercato vicino, a comprarmi una giacchettina, un berrettino e un paio di scarpe. Quando tornerò a casa, – soggiunse ridendo, – sarò vestito così bene, che mi scambierete per un gran signore.
-E uscito di casa, cominciò a correre tutto allegro e contento. Quando a un tratto sentì chiamarsi per nome: e voltandosi, vide una bella Lumaca che sbucava fuori della siepe.
-– Non mi riconosci? – disse la Lumaca.
-– Mi pare e non mi pare...
-– Non ti ricordi di quella Lumaca, che stava per cameriera con la Fata dai capelli turchini? Non ti rammenti di quella volta, quando scesi a farti lume e che tu rimanesti con un piede confitto nell’uscio di casa?
-– Mi rammento di tutto, – gridò Pinocchio. – Rispondimi subito, Lumachina bella: dove hai lasciato la mia buona Fata? Che fa? Mi ha perdonato? Si ricorda sempre di me? Mi vuol sempre bene? È molto lontana da qui? Potrei andare a trovarla?
-A tutte queste domande fatte precipitosamente e senza ripigliar fiato, la Lumaca rispose con la sua solita flemma:
-– Pinocchio mio! La povera Fata giace in un fondo di letto allo spedale!...
-– Allo spedale?...
-– Pur troppo! Colpita da mille disgrazie, si è gravemente ammalata e non ha più da comprarsi un boccon di pane.
-– Davvero?... Oh! Che gran dolore che mi hai dato! Oh! povera Fatina! Povera Fatina! Povera Fatina!... Se avessi un milione, correrei a portarglielo... Ma io non ho che quaranta soldi... eccoli qui: andavo giusto a comprarmi un vestito nuovo. Prendili, Lumaca, e và a portarli subito alla mia buona Fata.
-– E il tuo vestito nuovo?...
-– Che m’importa del vestito nuovo? Venderei anche questi cenci che ho addosso, per poterla aiutare! Và, Lumaca, spìcciati: e fra due giorni ritorna qui, che spero di poterti dare qualche altro soldo. Finora ho lavorato per mantenere il mio babbo: da oggi in là, lavorerò cinque ore di più per mantenere anche la mia buona mamma. Addio, Lumaca, e fra due giorni ti aspetto.
-La Lumaca, contro il suo costume, cominciò a correre come una lucertola nei grandi solleoni d’agosto.
-Quando Pinocchio tornò a casa, il suo babbo gli domandò:
-– E il vestito nuovo?
-– Non m’è stato possibile di trovarne uno che mi tornasse bene. Pazienza!... Lo comprerò un’altra volta.
-Quella sera Pinocchio, invece di vegliare fino alle dieci, vegliò fino alla mezzanotte suonata; e invece di far otto canestre di giunco ne fece sedici.
-Poi andò a letto e si addormentò. E nel dormire, gli parve di vedere in sogno la Fata, tutta bella e sorridente, la quale, dopo avergli dato un bacio, gli disse così.
-– Bravo Pinocchio! In grazia del tuo buon cuore, io ti perdono tutte le monellerie che hai fatto fino a oggi. I ragazzi che assistono amorosamente i propri genitori nelle loro miserie e nelle loro infermità, meritano sempre gran lode e grande affetto, anche se non possono esser citati come modelli d’ubbidienza e di buona condotta. Metti giudizio per l’avvenire, e sarai felice.
-A questo punto il sogno finì, e Pinocchio si svegliò con tanto d’occhi spalancati.
-Ora immaginatevi voi quale fu la sua maraviglia quando, svegliandosi, si accorse che non era più un burattino di legno: ma che era diventato, invece, un ragazzo come tutti gli altri. Dette un’occhiata all’intorno e invece delle solite pareti di paglia della capanna, vide una bella camerina ammobiliata e agghindata con una semplicità quasi elegante. Saltando giù dal letto, trovò preparato un bel vestiario nuovo, un berretto nuovo e un paio di stivaletti di pelle, che gli tornavano una vera pittura.
-Appena si fu vestito gli venne fatto naturalmente di mettere la mani nelle tasche e tirò fuori un piccolo portamonete d’avorio, sul quale erano scritte queste parole: «La Fata dai capelli turchini restituisce al suo caro Pinocchio i quaranta soldi e lo ringrazia tanto del suo buon cuore». Aperto il portamonete, invece dei quaranta soldi di rame, vi luccicavano quaranta zecchini d’oro, tutti nuovi di zecca.
-Dopo andò a guardarsi allo specchio, e gli parve d’essere un altro. Non vide più riflessa la solita immagine della marionetta di legno, ma vide l’immagine vispa e intelligente di un bel fanciullo coi capelli castagni, cogli occhi celesti e con un’aria allegra e festosa come una pasqua di rose.
-In mezzo a tutte queste meraviglie, che si succedevano le une alle altre, Pinocchio non sapeva più nemmeno lui se era desto davvero o se sognava sempre a occhi aperti.
-– E il mio babbo dov’è? – gridò tutt’a un tratto: ed entrato nella stanza accanto trovò il vecchio Geppetto sano, arzillo e di buonumore, come una volta, il quale, avendo ripreso subito la sua professione d’intagliatore in legno, stava appunto disegnando una bellissima cornice ricca di fogliami, di fiori e di testine di diversi animali.
-– Levatemi una curiosità, babbino: ma come si spiega tutto questo cambiamento improvviso? – gli domandò Pinocchio saltandogli al collo e coprendolo di baci.
-– Questo improvviso cambiamento in casa nostra è tutto merito tuo, – disse Geppetto.
-– Perché merito mio?...
-– Perché quando i ragazzi, di cattivi diventano buoni, hanno la virtù di far prendere un aspetto nuovo e sorridente anche all’interno delle loro famiglie.
-– E il vecchio Pinocchio di legno dove si sarà nascosto?
-– Eccolo là, – rispose Geppetto; e gli accennò un grosso burattino appoggiato a una seggiola, col capo girato sur una parte, con le braccia ciondoloni e con le gambe incrocicchiate e ripiegate a mezzo, da parere un miracolo se stava ritto.
-Pinocchio si voltò a guardarlo; e dopo che l’ebbe guardato un poco, disse dentro di sé con grandissima compiacenza:
-– Com’ero buffo, quand’ero un burattino!... e come ora son contento di essere diventato un ragazzino perbene!...
-Fine.
+I.
+
+
+Era la notte dal 12 al 13 di gennaio 1857, e per la via Assarotti, a
+Genova, soffiava un vento come suole soffiare in quest'ampia via,
+quando Eolo scatena uno de' suoi sudditi sulla regina del Tirreno.
+
+È tramontana? è scirocco? è libeccio? Non ne sapete nulla. Esce, non
+si sa da dove, e v'investe da tutte le parti. Guai allo scribacchino
+municipale che si lascia cogliere ad occhi aperti, perchè risica di
+andare a palazzo Tursi colla polvere negli occhi, di non veder più lo
+scrittoio e di dover chiedere una licenza di ventiquattr'ore, che il
+capo uffizio non è sempre disposto a concedere! Guai alla signora, che
+non sta attenta a raccogliersi la veste dattorno, perchè il vento è
+curioso di segreti e, quel che è peggio, ama troppo di propalarli ai
+viandanti.
+
+Ma perchè sto io a discorrervi del vento? La storia che vi racconto
+non occorre in mezzo alla strada, ma in un elegante quartierino al
+terzo piano del secondo palazzo a sinistra.
+
+Abita colassù, cioè, dico male, abitava nel gennaio 1857 il
+protagonista del mio racconto, uomo sui trentaquattro, laureato in
+leggi, scapolo, non brutto, nè antipatico, e con ventimila lire
+d'entrata.
+
+Trentaquattro anni son forse troppi; la laurea in leggi non è nulla;
+ma l'essere scapolo, non brutto nè antipatico, e l'avere ventimila
+lire d'entrata, è già molto per esser felici, quando si abbiano
+desiderii modesti.
+
+Pure, Roberto Fenoglio non era felice; si annoiava da mattina a sera,
+da sera a mattina. Aveva buoni e gioviali amici, ai quali imprestava
+spesso del denaro, e che qualche volta glielo restituivano; una
+vecchia governante che non gli dava molestia; un cuoco che non lo
+derubava; un cavallo proverbiale per la dolcezza del suo trotto; uno
+scanno a teatro senza noiosi vicini; e tuttavia non era felice, e si
+annoiava maledettamente.
+
+Aveva provato a fare qualcosa, ad occuparsi; ma nessuna occupazione
+gli andava a' versi, e a breve andare se n'era stancato. Ma queste
+cose le mie belle lettrici le udranno dalla sua bocca, imperocchè io
+lo presento loro nel primo salotto del suo quartierino, alle tre dopo
+mezzanotte, vestito da cinese, in atto di congedare uno sciame di
+giovinotti e di allegre mascherine.
+
+Perchè vestito da cinese? perchè quelle mascherine?
+
+Roberto Fenoglio aveva raccolto in casa sua quella sera tutti i suoi
+amici, tanto per passar la noia in compagnia. S'era suonato, ballato e
+cenato, colla massima libertà ed allegrezza. Le dame non erano severe,
+nè contegnose. Il rispettabile corpo di ballo del teatro Carlo Felice
+aveva dato il suo meglio a quella festa; le mammine erano sazie e
+contente; le silfidi, contente e non sazie, domandavano un'altra festa
+come quella che Roberto Fenoglio aveva dato loro, con tanta
+splendidezza di mandarino annoiato.
+
+Le allegre mascherine se ne andavano, accompagnate dai fidi cavalieri,
+ben chiuse nei loro accappatoi, per custodirsi dal vento, che si udia
+zufolare di fuori; se ne andavano giù per le scale, ridendo e
+cinguettando come uno stuolo di passere, o di cingallegre, e destando
+tutto il pacifico vicinato.
+
+Il tranquillo berretto di cotone si rizzava commosso dalla
+rimboccatura del letto matrimoniale, e chiedeva:
+
+--Che cos'è quest'allegro rumore? Ah, capisco; si balla dall'avvocato
+Fenoglio.
+
+E un sospiro mal represso chiudeva la frase. E lì, una cuffia lavorata
+all'uncinetto si rizzava a sua volta, per soggiungere:
+
+--Ma come fa l'avvocato Fenoglio a dar delle feste da ballo, egli che
+non è ammogliato? Quali signore possono andare in casa sua?
+
+Domanda, questa, a cui il berretto di cotone non rispondeva, e si
+voltava dall'altro lato, tirandosi la rimboccatura del lenzuolo fin
+sopra il becchetto.
+
+La cuffia intanto pensava, pensava.... che cosa pensava? forse, che il
+berretto di cotone non era la più bella cosa del mondo. E il berretto
+di cotone, dal canto suo, fantasticava una serie di variazioni su
+questo tema: «beato Fenoglio! egli l'ha indovinata davvero!»
+
+Lasciamo pensare, fantasticare e riaddormentarsi da capo questi due
+malinconici simboli dell'Imeneo, e torniamo al nostro protagonista,
+che, ritto nel salotto, si volgeva a Felice Magnasco, ultimo rimasto
+de' suoi convitati, per dirgli, con piglio di burlesca cerimonia
+cinese:
+
+--_A-ing-fo-hi_!
+
+Felice Magnasco, un giovinotto elegante ed attillato, come ogni figlio
+d'Adamo che usi farsi vestire (o spogliare) da un sarto di grido,
+diede una crollata di spalle, che fece far due grinze al suo abito
+nero, e rispose:
+
+--Orvia! Gli è così che tu accomiati il tuo amico migliore?
+
+--Sto in carattere,--soggiunse Fenoglio.--Non ti pare che io sia un
+bel mandarino cinese?
+
+--Al diavolo la Cina!--proruppe l'altro,--io preferisco la tua cena.
+
+--Oh bello, bello, stupendo! Ripetilo, Felice, te ne prego.
+
+--Che cosa?
+
+--Il tuo bisticcio. Sai che amo i bisticci, come tu le bistecche....
+Ah, ah! che te ne pare del mio? Gli è un po' stiracchiato, come le mie
+braccia, tutta questa sera, per effetto della noia.
+
+--Tu sei dunque annoiato?
+
+--Sì, Felicino, pur troppo; il figlio della luna, il cugino del sole,
+s'è maledettamente annoiato.
+
+--Male! io mi son divertito. È vero che le spese non le ho fatte io, e
+piacere che non sente il rame è pretto piacere. Che ottima cena! Viva
+te, Roberto primo ed unico della tua dinastia! Viva il tuo vino, i
+tuoi tartufi! e le tue _bajadere_. Che vispe ragazze! Oh non sai tu,
+che, se non era il pensiero della mia bella cugina, io questa sera ne
+sposavo una, senza tanti preamboli?
+
+--Ti ringrazio per lei della tua buona intenzione,--rispose,
+spalancando le fauci e tendendo le braccia, il buon mandarino,--e ti
+ringrazio per me, se non sei costretto a sbadigliare, come io faccio
+in questo punto per la millesima volta.
+
+--Ma che diamine ti saltò in mente di vestirti a quel modo e di
+costringerti a non metter fuori che cinque o sei monosillabi?
+
+--Compatiscimi, Felicino! Ho pensato che, essendo i cinesi il popolo
+più cerimonioso del mondo, io, come cerimoniere di casa mia, non
+potevo fare a meno di vestirmi da mandarino. Ora tu m'hai veduto ed
+udito; non ho fatto altro che dire _A-ing-fo-hi_, che in cinese, io
+credo, significa: son molto lieto di vedervi.
+
+--E i tuoi convitati,--soggiunse ridendo Felice,--ti hanno trovato
+compitissimo.--
+
+Roberto Fenoglio si lasciò cadere con aria stanca sul canapè.
+
+--Tu mi consoli, amico!--diss'egli, dopo un lungo sospiro.--Morrò
+almeno contento dell'altrui contentezza.
+
+--Che diamine dici? Sei tu pazzo ora?
+
+--No, parlo da senno e del miglior ch'io m'abbia. Sentimi, Felice; io
+non posso più tirare innanzi questa monotona vita. Io non faccio un
+passo senza che il piede medesimo si annoi d'esser mosso.
+
+--Ecco una variante del _Malade imaginaire_!--esclamò Felice, in
+quella che andava a sedersi comodamente in una poltrona, di rincontro
+a Roberto Fenoglio.
+
+Questi non badò all'atto di Felice, intento com'era a rispondergli.
+
+--Ah sì, in tal guisa parlano i sani agli infermi. Anch'io, al
+capezzale di un tisico, gli ho detto un giorno: ma che diamine parlate
+voi di morire? Avete le guancie colorite come una mela. E dieci giorni
+dopo era morto.
+
+--Dilla su dunque una volta, questa tua malattia, ed io farò di
+trovarti un buon medico.
+
+--Ah ci vuol altro che un medico! La scienza non conosce il mio male,
+non lo ha classificato ancora ne' suoi libri; ma esso esiste, esso è
+là dentro.
+
+--Dove?
+
+--In quell'orologio a pendolo. Esso ne è il simbolo parlante, esso il
+complice infame. Non odi? tran.... tran.... tran.... Maledetto! È lui
+che ci misura la vita e ce la fa mandar giù in ventiquattro pillole al
+giorno; è lui l'omeopatico che ci tiene a bada con sessantesimi d'ora,
+con sessantesimi di minuto, e ci fa morire con dosi infinitesime; è
+lui.... Insomma, che ti dirò? Io odio gli orologi. Giovinetto ancora,
+io già presentivo la guerra che m'avrebbero mossa questi nemici
+dell'umanità, e mi vendicavo, anticipatamente, mandandoli, l'un dopo
+l'altro, al Monte di pietà. Adesso, si è uomini sodi, padroni di sè e
+delle sue ventimila lire d'entrata, e queste vendette bisogna
+lasciarle in disparte. Ma io troverò pure uno spediente; metterò, non
+foss'altro, un premio di mille lire per colui che scriverà un libro
+contro gli orologi, da camera e da tasca, pendoli, cronometri,
+ripetizioni, cilindri, saponette, áncore, castelli, ecc., ecc., e
+proverà che il loro inventore è stato un cattivo arnese.... un
+briccone.--
+
+In quella che l'avvocato Fenoglio tirava giù con burlesca gravità
+contro i poveri orologi, Felice aveva cavato il suo dalla tasca del
+pianciotto e ne faceva scattare il coperchio d'oro.
+
+--O il tuo va male, o il mio;--disse egli.--Son già le tre e mezzo del
+mattino, e debbo ancora chiederti un servizio innanzi di andarmene.--
+
+Ma Fenoglio non gli dava retta; aveva veduto l'oriuolo di Felice e
+volea rompergli una lancia addosso.
+
+--Ah, _tu quoque, Brute_? E tu sei un uomo che si diverte? col nemico
+in saccoccia?
+
+--Che vuoi? è la consuetudine. E poi, non si è mica schiavi del
+proprio orologio! Il mio, come quello di tutti i figli di Adamo, va
+bene una volta all'anno. Io lo consulto per passatempo; egli fa a modo
+suo, io al mio, e andiamo d'accordo come marito e moglie. Ma tu,
+piuttosto, perchè non rompi il tuo, e non te lo levi dai piedi?
+
+--Bravo! e la gente di servizio? Esso è in casa un arnese necessario,
+fatale, come la noia per me; il suo _tran tran_ ha dato la misura al
+tran tran della mia esistenza. Rompessi anche il pendolo, la mia vita
+monotona suonerebbe, io credo, le ore e i quarti d'ora in vece sua. Oh
+Felice, felice te che non ti annoi!
+
+--E non mi avverrà mai fin ch'io viva:--rispose Magnasco;--io ho per
+cotesto un segreto infallibile.
+
+--Dove si vende? ch'io vo subito a comperarlo, senza nemmanco levarmi
+questa zimarra di dosso....
+
+--Oh, non tanta furia! Tu non hai bisogno di andare dallo speziale per
+questo. Fa a modo mio; abbandonati all'ignoto. Non chiedere mai a te
+stesso: «che cosa debbo io fare quest'oggi, per passar mattana?» Vedi,
+Fenoglio; io non mi sono mai così divertito, come un giorno che uscii
+di casa nell'intento di annoiarmi. Lascia operare il caso. Passi per
+una strada? Non isvoltare alla solita cantonata; va innanzi. Là
+troverai quell'amico che andavi cercando al caffè, e che, svoltando
+alla cantonata anzidetta, non avresti trovato di certo. Là vedrai una
+bella merciaia, che ti venderà un fazzoletto, mezzo seta e mezzo
+cotone, che regalerai poscia alla cameriera della tua bella, col
+risparmio di tre lire. Là vedrai una sconosciuta; la seguirai, e ti
+buscherai un dolce sorriso da lei, o un duello coll'amante; le quali
+cose ti condurranno in un altro ordine di pensieri e di conoscenze,
+che tu non avevi, uscendo di casa, e che potranno anche mutare del
+tutto il tuo sistema di vita. Insomma, non ragionare innanzi di fare,
+ragiona dopo; non andar colla testa, ma coi piedi; fa conto insomma di
+giuocare a mosca cieca.
+
+--Ma....--soggiunse Roberto Fenoglio,--e se dò del naso in qualche
+spigolo?....
+
+--Gli è,--rispose gravemente Magnasco,--uno tra gli sconci di questa
+teorica, per altro bellissima.
+
+--Orbene, mi proverò;--disse Roberto. E intanto si stiracchiava sul
+canapè, sbadigliando di bel nuovo.
+
+Felice se ne avvide e fu sollecito ad alzarsi.
+
+--Il tuo sbadiglio,--diss'egli,--mi prova che debbo partire. Diamine!
+le quattro suonate! Ed io già avevo dimenticato lo scopo della mia
+fermata! Fenoglio, sai? debbo chiederti un servigio....
+
+--_In manus tuas, domine._ Ti occorre denaro? Bada che non potrei oggi
+imprestarti più di duemila lire.
+
+--Che! non ho bisogno di denaro, sibbene di un servigio assai più
+rilevante e più delicato.
+
+--Un duello?
+
+--Quasi; vo' prender moglie.
+
+--Ah, per tutti i diavoli! _e come e quando nacque tal fiamma in te!_
+
+--La storia sarebbe troppo lunga a raccontarsi ora,--rispose
+Magnasco,--ed io ho bisogno di riposare almanco tre ore, innanzi di
+tornare da te.
+
+--Tornare! ma come? perchè?
+
+--Eccoti il negozio in poche parole. Io ho una cugina....
+
+--La vedova?
+
+--Per l'appunto; la conosci forse?
+
+--No, in fede mia; me ne hai parlato tu stesso qualche volta, e ancora
+poco fa, mi dicevi....
+
+--È giusto, vedi che bestia! Or dunque, mia cugina, la vedova, è una
+crudele quanto adorata beltà, e quando io le parlo di amore, ella si
+mette a ridere. Io le accenno cori, ed ella mi risponde picche.
+
+--Che c'entro io nel vostro _tresette_?
+
+--Tu puoi venire da lei; le ho già parlato di te, come d'uomo a modo,
+rispettabile, assennato....
+
+--Ti par proprio ch'io sia tutto ciò; Felicino?
+
+--Io ti presento a lei,--proseguì, senza turbarsi, Magnasco,--e tu
+perori la mia causa; non subito, ci s'intende, ma a poco a poco, con
+delicate entrature.... mi capisci? Colla tua parlantina di Cicerone,
+puoi essermi molto utile. Le fai vedere che buon partito sarebbe per
+lei sposare un giovane par mio, gentile di modi, dolce di umore, e
+molto avveduto in materia d'interessi....
+
+--E ti par proprio d'essere tutto ciò, Felicino?--chiese Roberto
+Fenoglio.
+
+Felicino anche qui fece orecchie da mercante, e tirò innanzi nella sua
+orazione.
+
+--Mia cugina è ricca, e il suo fattore la deruba a man salva, la
+spoglia....
+
+--Ah! codesto gli è grave!--interruppe Fenoglio,--spogliarla eziandio?
+Questo è un cumulare gli uffici di fattore e di cameriera, e capisco
+che, se la cugina è bella, siccome m'hai detto, ti spiacerà
+maledettamente che altri faccia questo uffizio presso di lei. Ah, ah,
+che te ne pare di questo?
+
+--È stiracchiato più degli altri;--rispose Felicino.--Ma dunque, vuoi
+rendermi questo servigio?
+
+--Ci stavo appunto pensando. Tu vuoi far di me una specie di Barbiere
+di Siviglia.....
+
+--Potresti supporre che....?
+
+--Altro che supporre! lo credo, lo vedo; ma non importa. Se pensi che
+i miei talenti oratorî possano giovarti presso di lei.... Ah,
+Felicino! io ero nato per essere oratore! Basta, ti servirò; tu mi hai
+dato il tuo specifico contro la noia, io ti son debitore del
+ricambio.... se pur lo sarà! A che ora si va da lei?
+
+--Sul mezzogiorno; ella è mattiniera come una allodola. Io dunque
+verrò da te alle dieci: ti vesti, andiamo ad asciolvere insieme, e
+poi, a piccoli passi, verso il tempio della diva. Addio, dunque, e
+rammenta i miei consigli....
+
+--Abbandonarsi all'ignoto....--disse Fenoglio.
+
+--Sicuro;--soggiunse Magnasco,--lasciare operare il caso....
+
+--E ragionar co' piedi;--conchiuse l'altro.--Non dubitare, Felicino,
+ti imiterò fedelmente, servilmente, e comincierò a ragionare in tal
+guisa, facendo il tuo elogio alla bella cugina.
+
+--Se' arguto, per un mandarino!
+
+--_A-ing-fo-hi!_--rispose con piglio di umiltà reverente Roberto
+Fenoglio,--_A-ing-fo-hi._
+
+--Che in cinese significa....
+
+--Amico, te ne ringrazio di cuore.
+
+--La si tira per tutti i versi, quella tua
+frase....
+
+--Ah, che vuoi? la è una delle prerogative della lingua cinese.--
+
+E così, giostrando a sciocchezze, si separarono.
+
+--Stattene a tuo bell'agio sdraiato,--disse Felicino a Roberto, che
+voleva alzarsi per accompagnarlo in anticamera:--conosco la strada;
+tirerò l'uscio dietro di me.
+
+--_Fiat voluntas tua!_--rispose Roberto, a cui in quell'ora la
+posizione orizzontale era dolce come a Magnasco il pensiero di sposar
+sua cugina, o, per dir meglio, le sue cinquecento mila lire.
+
+Alle quali cose pensando, e al soccorso che gli avrebbe prestato
+Fenoglio contro la ostinata resistenza della cuginesca cittadella,
+Magnasco se ne andò col cuore contento e il piè leggiero.
+
+E andandosene, trasse l'uscio dietro a sè, siccome aveva detto a
+Fenoglio; ma non badò punto a sincerarsi se la stanghetta della toppa
+a sdrucciolo, che chiudeva la porta del suo amico, avesse battuto
+nell'orlo della bocchetta, per modo da cacciarvisi dentro e chiuder
+davvero.
+
+Oh dio Caso, eccone delle tue!
+
+
+
+
+II.
+
+
+Roberto Fenoglio, come vi ho detto, era rimasto sdraiato sul suo
+canapè; un soffice canapè foderato di velluto, dal quale io, se ci
+fossi stato, non mi sarei mosso neanco per andare a nozze, e metto
+pegno non vi sareste mosso voi, cortese lettore, neanco per mandare a
+comperare il libro che mi dà modo di ragionare con voi.
+
+L'annoiato mandarino stava fantasticando, tra la veglia e il sonno,
+intorno ai consigli di Felice Magnasco.
+
+--Vedete mo che ingegno ha quel capo ameno di Felicino! Egli è giunto
+a sciogliere un problema, pel quale io mi vo beccando da dodici anni
+il cervello. Abbandonarsi all'ignoto, lasciar operare il dio Caso,
+ragionare co' piedi, equivale a sfuggire il _tran tran_ della vita.
+L'equazione è perfetta, e un matematico non ci troverebbe nulla a
+ridire. Applichiamola dunque!... E prima di tutto, che cosa farò io
+tra dieci minuti? che bestia! cominciavo a ragionare! non debbo, non
+voglio sapere, che cosa farò tra dieci minuti.... Auf! che sonno!
+andiamo a dormire; sarà la miglior cosa che io possa fare. Felicino
+dovrà tornare stamane per condurmi dalla sua bella cugina, e non posso
+andare da lei morto dal sonno. E da capo! No, io non debbo andare a
+dormire; la è cosa troppo usuale; io ricasco nella consuetudine, e
+questa io debbo sfuggirla ad ogni costo. Eccomi qui, su questo
+canapè... Ci sono a caso.... Chi ardirebbe asserire che io non ci sono
+per mero caso? Che cosa mi accadrà egli di nuovo su questo canapè?
+L'ardua sentenza ai posteri. Che sonno! andrei volontieri a letto....
+Ma via, Fenoglio, non lasciarti così vilmente sopraffare dalla
+ragione! Si direbbe che hai paura dell'ignoto. Chi è questo signor
+ignoto?... È brutto o bello? E la cugina di Felice, è bella davvero
+come ei la dipinge? O non l'ama piuttosto per le sue ricchezze? Già,
+volere o non volere, il denaro si ficca sempre dappertutto. Diciamo di
+no; sacramentiamo che non è vero; ma la ricchezza comanda agli occhi
+del nostro corpo, come a quelli della nostra ragione.... Ma chi sa?
+potrebbe anco esser bella, questa cugina!...
+
+Lettrici e lettori, io vi fo grazia di tutte le altre considerazioni
+scucite del mio protagonista. La pigrizia, più assai de' consigli
+dell'amico, lo aveva tenuto sul canapè, dove, pochi minuti dopo, egli
+era rimasto assopito.
+
+Non vi giurerei che le copiose libazioni dello sciampagna spumante non
+c'entrassero anch'esse per una larga porzione. Roberto Fenoglio era
+uomo che non disprezzava punto il bicchiere, e quella notte, poi, in
+mezzo ad una brigata di capi scarichi e di gaie alunne di Tersicore,
+egli aveva pensato a dare il buon esempio, bevendo allegramente per
+quattro.
+
+Dormi, Fenoglio; dormi, mandarino annoiato; il tuo sonno non vuole
+durar molto.
+
+Imperocchè, voi già lo avete indovinato, belle lettrici e lettori
+cortesi, io non lo lascierò solo sul suo canapè, e non prolungherò la
+_scena muta_ oltre i confini della vostra pazienza.
+
+Venite con me verso l'uscio di casa. Non udite su per le scale un
+muover di passi frettolosi e leggieri? Non abbiate timore di ladri;
+insieme co' passi, s'ode il fruscìo di una veste di seta.
+
+Chi è questa donna che sale, o, per dir meglio, che vola, sfiorando
+appena del piede e del lembo della sua veste gli scalini, e si ferma,
+si rannicchia spaurita, tremante, ansante, sul pianerottolo, vicino
+all'uscio semichiuso di Roberto Fenoglio?
+
+Aspettate, e lo saprete. La bella incognita (imperocchè essa è bella,
+ed io già lo so, quantunque siamo tuttavia al buio), la bella
+incognita, dico, rattiene colassù la sua corsa, e raccolte intorno a
+sè le larghe pieghe del suo accappatoio di seta, tende l'orecchio per
+cogliere ogni più lieve rumore che possa giungere dal basso. Non ode
+nulla, e le si allarga il cuore; perciò, fattasi più animosa, si
+attenta di sporgere il capo sulla ringhiera.... Ma ohimè! Appunto
+allora comincia ad udirsi giù in fondo alle scale uno stropiccìo di
+piedi, quindi un rumore confuso a cui tien dietro lo scoppiettìo di un
+zolfanello strofinato su d'una ruvida superficie, e un raggio di luce
+balena dal pozzo della scala.
+
+La povera bella si rannicchia da capo nel suo angolo, ma non istà
+ferma al suo posto neppure un minuto secondo.
+
+--Dio mio! come fare?--ella mormora tra sè,--dove potrò salvarmi!--
+
+Tremante, confusa, ella si avanza a tentoni, brancicando verso la
+parete, come per cercare le imposte di un uscio; che certo ha da
+trovarsi su quel pianerottolo. Ella suonerà, domanderà soccorso.... ma
+giungeranno in tempo ad aprirle? Chi sa? intanto ella va cercando
+colle mani il vano di quest'uscio e la corda del campanello, ma senza
+pro. La sua manina leggiadra (io lo so, quantunque siamo al buio, e la
+conoscerei tra mille), la sua manina leggiadra, dico, erra un tratto
+nel vuoto, quindi urta in uno dei battenti dell'uscio; ed oh
+maraviglia! il battente si apre da sè, e il pianerottolo si rischiara
+d'un subito, all'interna luce dell'anticamera di Roberto Fenoglio.
+
+Benéfici effetti della trascuratezza di Felicino Magnasco, che non
+aveva badato a far scorrere la stanghetta della toppa a sdrucciolo
+nella sua rispettiva bocchetta! Oh caso, caso! E i filosofi verranno
+poi a sostenere che esso non è l'ordinatore, anzi l'azzeccagarbugli
+delle umane vicende?
+
+La povera bella fu, sulle prime, come sbigottita da quello aprirsi
+improvviso dell'uscio, al semplice tocco delle sue dita. Quel
+quartierino aperto, e in apparenza deserto, le metteva paura. Tremò
+tutta dal capo alle piante, e si ritrasse fin presso la ringhiera. Ma
+di là tornava ad udire il rumore dei passi, e al rumore dei passi si
+mescolava il discorso di due persone che salivano, del qual discorso
+giunse fino a lei spiccatamente una frase: _andiamo su, ella non ci
+sfugge di certo_. E allora la poverina si fece animo, guardò in alto
+come per chieder protezione dal Cielo innanzi di commettersi
+nell'antro ignoto di quel quartierino, che si schiudeva luminoso a'
+suoi occhi, e si buttò perduta nell'anticamera. La sala era deserta;
+imperocchè l'unico servitore di genere mascolino che fosse in quella
+casa, trattandosi di una festa un tal po' scapigliata, aveva avuto
+licenza di andarsene a letto dopo l'ultima versata di sciampagna, e la
+licenza gli era paruta un comando. La bella sconosciuta non ardì
+nemmeno richiuder l'uscio; chè le sembrava di cadere di Scilla in
+Cariddi, e non voleva precludersi la ritirata da un male peggiore. Si
+inoltrò guardinga fino ad una portiera di seta azzurra; stette incerta
+un tratto, quindi si provò a sollevarla dolcemente, sporse la sua
+testolina nel vano, e le si parò davanti agli occhi lo spettacolo del
+mandarino dormente.
+
+--Ah? Che vuol dir ciò?--chiese tra sè, con atto di meraviglia, la
+sconosciuta visitatrice. Di maraviglia, notate, non di paura!
+
+Un uomo che dorme non fa paura ad una donna. Giaele, Giuditta, e tante
+altre donne famose di quella risma, ne fanno testimonianza non dubbia.
+La nostra sconosciuta, che non aveva nè chiodi di configger nelle
+tempia a Sisara, nè testa da troncare ad Oloferne, e che però ci aveva
+la coscienza tranquilla, dopo quel primo atto di meraviglia, compose
+le labbra ad un sorriso; un bel sorriso, in fede mia, e che
+illeggiadriva di molto le sue bellissime labbra.
+
+Essa era bella, mio candido lettore, bella quasi come voi, mia adorata
+lettrice. Qui, poichè siamo alla luce dei doppieri (parlo in poesia,
+ma in umile prosa bisognerebbe dire di una lucerna Carcel), cadrebbe
+in acconcio uno scampolo di descrizione della sua ammirabile bellezza.
+Ma siccome non ho tempo da perdere, lascio che ve ne formiate voi un
+concetto colla fervida immaginazione, mio candido lettore, e che ve la
+raffiguriate voi, guardandovi nello specchio, mia adorata lettrice.
+
+--Un cinese?--pensò la sconosciuta, guardando Fenoglio.--O dove
+diamine son capitata? E nessun altro in questa casa.... non una donna
+a cui volgermi.... E quei due che salgono le scale!... Dio mio che
+faccie sinistre! E come mi correvano dietro! Ah! essi sono già qui,
+sul pianerottolo.... urtano nell'uscio.... Ma io non l'ho chiuso, non
+l'ho chiuso! E come fare adesso? Signore! signore!--
+
+Ma sì, chiamalo, Roberto Fenoglio aveva legato l'asino a buona
+caviglia, e non dava segno di volersi svegliare.
+
+Ella ripetè, collo stesso tono di voce sommessa con cui aveva
+cominciato a chiamarlo: signore! signore!
+
+--_A-ing-fo-hi!_--borbottò nel sonno il bravo mandarino Fenoglio.
+
+Cotesto non era rispondere, siccome ognun vede. La povera bella,
+sgomentata dal rumore che si faceva sul pianerottolo, ebbe ricorso ad
+uno stratagemma simile a quello del fagiano quando tenta di
+nascondersi agli occhi del cacciatore, ficcando la testa sotto un'ala;
+buttò l'accappatoio sotto una poltrona, che stava di fianco al canapè
+del mandarino, e si lasciò cadere su quella poltrona, rimanendovi
+supina in atto di donna dormente.
+
+--Ohè, Piccione! una porta aperta....
+
+--Vedo bene; la sarà entrata qua dentro, la fuggitiva.
+
+--Impossibile! Avrebbe badato a chiudere l'uscio dietro di sè. Qui c'è
+un altro negozio.... un furto consumato....
+
+--Ragione di più per entrare!
+
+--Sicuro, entriamo!
+
+
+
+
+III.
+
+
+Questo dialogo avveniva sul pianerottolo, tra i due persecutori della
+bella sconosciuta, i quali non erano altrimenti due Adoni da
+quadrivio, sibbene due sergenti di Questura, il Negri e il Piccione.
+
+Lo strepito dei loro passi mascolini nell'anticamera e il percuoter
+delle loro daghe contro le masserizie, fecero quello che non aveva
+potuto ottenere la vocina della sconosciuta; vo' dire che destarono
+dal sonno l'avvocato Fenoglio, il quale balzò in piedi dal suo canapè,
+e vedendo alzare la portiera di seta e un braccio e una gamba
+introdursi nel salotto, urlò prontamente: _ai ladri!_ e diè di piglio
+ad una sedia di Chiavari, per servirsene come di una mazza ferrata
+contro gl'invasori del suo domicilio.
+
+--Si cheti, signore, si cheti!--disse il Negri facendosi innanzi.--Noi
+non siamo ladri, nè gente che le voglia far del male. Guardi alla
+nostra divisa.... Ma chi vedo? il signor avvocato....
+
+--Roberto Fenoglio in carne ed ossa,--rispose Fenoglio, che a sua
+volta aveva riconosciuto i sergenti;--ma che cosa vogliono le signorie
+loro a quest'ora, in casa dei pacifici cittadini?
+
+--Oh, la ci scusi, signor avvocato. Aveva l'uscio
+aperto....
+
+--Amico mio,--disse una vocina sottile che fece balzare due passi
+indietro il mio protagonista,--gli è stato di certo quel briccone di
+Battista, che va a ciaramellare di notte colla cameriera del quinto
+piano. Bisogna scacciarlo dal nostro servizio, non è egli vero?
+
+--Si certo, lo scaccieremo!--rispose Fenoglio.
+
+E intanto guardava, con aria da melenso, ora i sergenti, ora la
+sconosciuta, che lo aveva chiamato «amico mio.»
+
+--Non vorremmo aver cagionata la disgrazia di un povero
+servitore....--si provò a dire il Piccione.
+
+--Che! che!--ripigliò la signora.--È un fannullone, un che so io; non
+è egli vero, Roberto?
+
+--Sì, un briccone, un ladro, un assassino!--soggiunse Fenoglio, il
+quale non sapeva più quello che si dicesse.
+
+--Oh, in tal caso,--disse il Negri,--con licenza di Vossignoria, lo
+arresteremo.
+
+--Sì, arrestatelo.... cioè, no, lasciatelo stare, povero diavolo! Son
+questi i miei modi di dire.... io non uso chiamare con altri nomi la
+mia gente di servizio....
+
+--Egli bisogna tuttavia che tu gli tolga questo mal vezzo, Roberto
+mio!--disse la donna, mettendo con leggiadra dimestichezza il suo
+braccio sotto quello di Roberto Fenoglio.--Dimmi, non è egli vero che
+tu contenterai in ogni cosa tua moglie?--
+
+Fenoglio aveva l'aria di cader dalle nuvole. Si lasciò mettere il
+braccio di lei sotto il suo; anzi, posso giurarvi che, galante
+com'era, anco nei momenti più difficili, curvò con bel garbo il
+gomito, per accogliere il dolcissimo peso. Quel braccio si appoggiò
+sul suo con una pressione particolare, che parea dirgli: «tenetemi
+bordone, per carità!»; gli occhi della sconosciuta si volsero languidi
+a cercare una buona risposta ne' suoi; la sconosciuta era bella, assai
+bella; il contatto della sua aggraziata persona gli recava una
+commozione subitanea per tutte le vene, insomma, il sangue non è
+acqua, siamo tutti uomini, e Roberto Fenoglio rispose:
+
+--Si, moglie mia, farò di contentarti.--
+
+Tutto ciò era avvenuto in un batter d'occhio. Ora, accettata una
+condizione di cose, bisognava andare innanzi, mettere in buona vista
+tutto quel garbuglio; e Roberto, comunque fosse impacciato, ci si
+provò.
+
+--Vedete un po' che bel caso!--disse egli, voltandosi ai
+sergenti.--S'era suonato e ballato.... una festicciuola tra amici....
+ai quali avevo fatto conoscere mia moglie....
+
+--Ah sì!--interruppe il Negri.--Ella è ammogliato di fresco; noi nol
+sapevamo neppure....
+
+--Infatti,--disse Fenoglio,--io non ne avevo dato notizia a nessuno.
+
+--Un matrimonio _al gran destino_....--entrò a dire con aria peritosa
+il Piccione.
+
+--Come sarebbe a dire; al gran destino? Vorrete dir clandestino?
+Sicuro, ho fatto un matrimonio clandestino; ma ora l'abbiam propalato;
+tutti gli amici, i parenti, Genova tutta lo ha da sapere.--
+
+Così dicendo, Roberto Fenoglio si volse a guardare la sua improvvisata
+metà, che lo ricompensò delle sue parole con uno sguardo d'ineffabile
+tenerezza.
+
+--Che io possa morire, se ne capisco un'acca!--pensò egli tra sè.
+
+--Oh ce ne rallegriamo grandemente con Vossignoria!--disse il
+Piccione, che era il più cerimonioso dei due sergenti.--E ce ne
+rallegriamo anche colla sua signora....
+
+--Grazie, grazie!--rispose la leggiadra donnina, accompagnando le
+parole col più grazioso dei suoi divini sorrisi.
+
+--Suvvia, Piccione:--disse il Negri al compagno--noi adesso
+disturbiamo....
+
+--No, no, amici miei!--interruppe Fenoglio.--Voi non ve ne andrete
+così senza aver prima bevuto un bicchiere.
+
+--Scusi Vossignoria: ma noi eravamo venuti in questa scala per seguire
+una donna.... una....
+
+--Che cosa?--domandò con molta curiosità il padrone di casa.--Avete
+detto una.... Se la cosa può dirsi, finite, di grazia, la frase!
+
+--Oh, niente di male in quanto alla moralità personale....--
+
+Fenoglio respirò a larghi polmoni. Intanto il Negri proseguiva:
+
+--....Insomma, debbo dirlo? Si tratta di una emissaria di Mazzini. Il
+signor Questore ha saputo che questa donna, una delle più terribili
+cospiratrici contro il governo, è venuta da Londra a Genova, e che
+ella doveva trovarsi appunto in una casa qui presso.... Le nostre
+passeggiate debbono averla messa in sospetto di qualcosa, poichè una
+donna appunto (ed era certamente lei) è uscita dalla casa in discorso;
+ma, inseguita da noi, s'è ficcata nelle scale di questo palazzo....
+
+--Ah diamine!--esclamò Roberto Fenoglio.--E adesso come farete a
+trovarla?
+
+--Ella a quest'ora avrà potuto ridiscendere le scale!--si affrettò a
+soggiungere la signora.
+
+--Sicuro! dice bene la signora Fenoglio!--gridò il Piccione,
+percuotendosi la fronte colla palma della mano.--Vedi che bestia siamo
+stati noi altri! Ma qui bisogna correre.
+
+--Non tanta fretta!--interruppe ella sorridendo.--A quest'ora ella ha
+potuto andare molto lunge, e come vorreste trovarla! Gli è un colpo
+fallito, al quale non si rimedia, e sarà meglio vi ricordiate che il
+mio Roberto vi ha pregato di fermarvi ancora pochi minuti per berne un
+bicchiere.
+
+--La signora ha ragione!--disse il Negri con aria melanconica.--Ora,
+poichè la ci è sfuggita, beviamo.
+
+--Signor avvocato,--ripigliò il sergente Piccione,--beveremo alla
+salute della sua signora moglie, che è tanto gentile quanto bella.
+Scusi, signora, il complimento, compatisca; siamo gente alla
+buona....--
+
+Intanto Roberto Fenoglio era andato in una camera vicina e ne tornava
+con una bottiglia di Sciampagna, che fu sollecito a sturare per quei
+due ragguardevoli personaggi.
+
+--Alla salute della signora Fenoglio!--disse il Negri, alzando il
+calice spumante.
+
+--Che il Ciel la benedica, e le conceda una mezza dozzina di bei
+bambocci somiglianti al l'ottimo avvocato Fenoglio!--soggiunse il
+Piccione.
+
+--Grazie, amici, grazie!--rispose Fenoglio.--Noi faremo di non mandar
+vani i vostri amorevoli augurii.--
+
+E guardò sott'occhi la sua sconosciuta vicina, che si fe' rossa in
+volto come una ciliegia.
+
+Intanto quei due, sebbene, dopo una seconda e una terza libazione,
+avessero veduto il fondo della bottiglia, non se ne andavano ancora.
+Fenoglio era sulle spine, poichè gli premeva di sapere chi fosse
+quella donna, e come gli fosse capitata in casa. La donna, dal canto
+suo, ci doveva avere le sue buone ragioni, per affrettare coi voti la
+loro partenza.
+
+Il Negri, dopo una sosta di parecchi minuti secondi, così prese a
+parlare:
+
+--Signor avvocato, la mi scusi; avrei a chiederle.... ma non mi dia
+dell'indiscreto....
+
+--Oh, niente affatto!--rispose Fenoglio.
+
+--Sì, sì, la è una indiscretezza la nostra.... ma tant'è, non possiamo
+fare a meno di pregarla....
+
+--Ahi, ahi!--pensò il mandarino--che cosa vuole ora costui?--
+
+La povera bella, di rossa ch'ella era divenuta, si fe' più pallida di
+prima.
+
+--Vossignoria,--proseguì il sergente, senza addarsi di nulla,--è in
+relazione col nostro capo, il cavalier Gallesi....
+
+--Sicuro, sono in relazione con lui, con quella degna
+persona;--rispose Roberto.--Lo vedo qualche volta ed ho l'onore del
+suo saluto. Ma che cosa....
+
+--Ecco;--interruppe il Negri,--noi abbiamo fatto il nostro dovere,
+niente più niente meno del nostro dovere.... Ma se il signor cavaliere
+venisse a risapere che ci siamo lasciati sfuggire.... mi capisce?
+
+--Ah! sì, capisco,--disse Fenoglio, tornando a respirare
+liberamente,--io non debbo dir nulla. Non dubitate, sarò muto come una
+tromba.... cioè no, volevo dirle come una tomba. Che diamine! vedete
+mo' come talvolta ci tradisce la lingua.--
+
+Non era vero niente; Roberto Fenoglio, rasserenato dalla piega che
+aveva preso il negozio, tornava ai suoi primi amori col bisticcio.
+
+--Le siamo riconoscentissimi della sua bontà, signor avvocato!--entrò
+a dire il Piccione, colla lingua impacciata dallo Sciampagna.--In
+verità non potevamo aspettarci altro da un galantuomo pari suo. Oh se
+tutti fossero come Vossignoria, a questo mondo!
+
+--Taci là, bestione!--interruppe il Negri, che voleva schiccherare
+anch'egli un complimento all'avvocato.--Se tutti fossero come il
+signor cavaliere....
+
+--No, no, lasciate i titoli da parte, io non son cavaliere e me ne....
+me ne.... insomma, non lo sono!--conchiuse Roberto.
+
+--Il governo ha torto!--sentenziò il Negri.--Io lo servo, lo rispetto
+e lo venero, come è debito mio; ma egli ha torto a non far cavaliere
+un personaggio come Vossignoria. Basta, io non c'entro.... Che cosa
+dicevo, Piccione?
+
+--Dicevi che se tutti fossero....
+
+--Ah si, mi ricordo; volevo dirti che se tutti fossero come il signor
+avvocato, noi perderemmo il nostro pane, perchè non ci sarebbe nulla
+da fare nel nostro mestiere.--
+
+E accompagnate queste parole con un inchino, il Negri si congedò
+dall'avvocato Fenoglio, pregandolo, scongiurandolo da capo a condonar
+loro la molestia che gli avevano involontariamente recata.
+
+Così finì quella scena, che poteva avere ben altre conseguenze per uno
+dei due personaggi rimasti. Fenoglio accompagnò i due sergenti fino
+all'uscio di casa, e questa volta lo chiuse egli, colla debita
+attenzione, anzi con due mandate di chiave.
+
+Quindi tornò nel salotto, dov'era rimasta la sconosciuta, e, giunto
+sul limitare, si fermò, sporgendo il capo verso di lei, in aria d'un
+maiuscolo punto interrogativo.
+
+
+
+
+IV.
+
+
+La bella ignota era caduta sulla poltrona accanto al canapè. Lo sforzo
+di quella scena difficile l'aveva svigorita per modo da non sentirsi
+più reggere in piedi.
+
+--Oh, signore!--mormorò ella, più che non dicesse--la mia
+gratitudine....
+
+--Nulla, nulla, non mi ringraziate!--interruppe il mandarino.--Ditemi
+piuttosto, se non è un prentender troppo, chi siete voi, o signora,
+voi che vi fate di punto in bianco mia moglie, mi togliete dalla
+fronte quell'aureola di vergine.... e martire, la quale mi si
+confaceva pur tanto?
+
+--Signore....--balbettò la povera bella,--o signore.... voi siete così
+buono, avete un cuor così nobile....
+
+--Signora, io non ho cera qui sotto le mani per turarmi gli orecchi,
+come fece Ulisse, allorquando egli ebbe a trovarsi in un caso simile
+al mio; ma vi giuro che, se voi proseguite a parlarmi così dolcemente,
+io supplirò alla cera colla palma delle mani.--
+
+E dicendo queste parole, le quali arieggiavan assai più il madrigale
+che l'invettiva, Roberto Fenoglio fe' il doppio gesto di un uomo che
+vuol turarsi gli orecchi.
+
+Era grazioso in quell'atteggiamento, il nostro mandarino posticcio; e
+la signora, quantunque il momento non fosse da ciò, non potè
+rattenersi dal ridere.
+
+--Ah, vi pigliate anche giuoco di me, bella e terribile
+sconosciuta?--incalzò Roberto Fenoglio.--Avete ragione, in fede mia.
+Eccomi ammogliato senza saperlo, e con chi? con una donna
+_contemplata_ dall'articolo 185 del Codice penale.
+
+--Oh!--esclamò la signora alzandosi in piedi.
+
+--Non vi adirate per sovra mercato, signora!--fu sollecito a
+soggiungere Fenoglio.--L'articolo 185 non può offendere la dignità
+della donna. Ma in fine, i fatti _enunciati_ vi accusano; la
+prevenzione è contro di voi. Chi inseguivano quei due degni tutori
+dell'ordine pubblico, se non voi? se non una.... _horresco
+referens_.... una rivoluzionaria?
+
+--Mio buon signore,--disse la sconosciuta, accennandogli con atto
+leggiadro, che volesse chetarsi un tratto,--io vi prego, per quella
+cortesia che m'avete dimostrata fin qui, ad usar pazienza ancora un
+tantino. Tutto quello che è avvenuto stanotte ha bisogno di una
+spiegazione, e voi, gentile come siete, mi darete agio ad esporre le
+mie ragioni.
+
+--Tolga il Cielo che io voglia condannarvi senza ascoltarvi--rispose
+Roberto Fenoglio.--Non siamo più ai tempi della inquisizione, la Dio
+mercè, ed io son qui tutto orecchi ad udirle, queste vostre ragioni.
+
+--Or bene, signore, parlerò.... Ma anzitutto, voi siete un gentiluomo,
+e....
+
+--E me ne vanto, signora! Ho sempre saputo custodire i segreti che mi
+furono confidati, e tanto più facilmente, in quanto che io sono l'uomo
+più smemorato che viva sotto la cappa del cielo. Tutto ciò che ode il
+mio orecchio destro non ha neppure il tempo di giungere all'orecchio
+sinistro, che io già l'ho dimenticato.
+
+--Tanto meglio! Sappiate dunque che la rivoluzionaria c'è, e appunto
+quella che i due uomini della Questura cercavano....
+
+--Ah! voi lo confessate? Ma come mai una così leggiadra donnina
+(scusate la schiettezza, ma io amo dire anzitutto la verità, la pura
+verità, niente altro che la verità), come mai una così leggiadra
+donnina, quale voi siete, va a ficcarsi in questi viluppi?
+
+--Ringrazio i vostri occhi dell'inganno in cui mostrano
+d'essere,--rispose ella, sorridendo traditorescamente,--ma non debbo
+lasciar del pari in errore il vostro giudizio. Quella rivoluzionaria,
+di cui si parla, non sono io; siete contento?
+
+--Respiro, signora, respiro; ma proseguite, di grazia!
+
+--Ecco dunque;--continuò la signora,--questa rivoluzionaria è mia
+amica. Rivoluzionaria! Anche il vocabolo è improprio, imperocchè essa
+non è che la moglie di un ottimo cittadino, il quale è condannato nel
+capo e vive lontano dal suo paese, amandolo da lungi e facendo voti
+perchè si muti quest'ordine di cose, che nessun italiano di core....
+
+--Dovrebbe tollerare!--conchiuse Roberto Fenoglio.
+
+--Ah, son lieta di parlare con un uomo!--disse la signora, stendendo
+la mano a Roberto, che l'afferrò prontamente e vi stampò un rispettoso
+bacio, se pure è vero che i baci siano una testimonianza di rispetto.
+
+Ella ritrasse dolcemente la sua mano e proseguì:
+
+--La mia buona Erminia (così ella si chiama) non è qui venuta per
+cospirare, sibbene per vedere un suo figliuoletto che ha lasciato a
+Genova in casa de' suoi congiunti, e che da qualche settimana era
+infermo. La poverina, giunta ieri, mi ha fatto pregare stanotte di
+recarmi da lei, e voi potete argomentar di leggieri che io non
+mettessi indugio a contentarla. Il mio servitore mi accompagna fino
+alla porta, e lo rimando a casa per maggior precauzione. Ora ecco che,
+mentre io salgo le scale, odo rumor di passi.... intimorita, mi
+ritraggo; essi mi hanno sentita, e giù per le scale verso di me!
+Allora io non so più quel che mi faccia, esco fuori, e senza pure
+voltarmi indietro, vengo a rifugiar nel portico di questo palazzo,
+sperando che non mi abbiano veduta ad entrarvi. Ero in errore; mi
+seguono; io salgo pian piano fin qui.... trovo un uscio aperto, e voi
+sapete il rimanente, voi che mi avete presa a proteggere, senza pur
+sapere chi io mi fossi. E di ciò permettete che vi ringrazi, o
+signore, poichè, sebbene per me non avessi nulla a temere, la mia
+dignità di donna era tuttavia a repentaglio, nel trovarmi sola, di
+notte, e inseguita a quel modo!... Ah, mio Dio? rabbrividisco al solo
+pensarvi.
+
+--Avete ragione, signora,--disse Roberto, com'ella ebbe finito il suo
+discorso,--avete ragione. Una donna sola, di notte, e così bella, come
+voi.... Ma perchè siete voi così bella?--
+
+E uscendo in questa esclamazione, improvvisa, Roberto Fenoglio mandò
+un lungo sospiro.
+
+--Che cosa avete?--domandò ella a sua volta.
+
+--_A-ing-fo-hi_!--rispose egli sospirando da capo.
+
+--E che cosa vuol dire quest'altra frase?
+
+--Vuol dire, o signora.... Ma anzitutto, mi promettete di non andar in
+collera?
+
+--Ve lo prometto, purchè non mi diciate
+complimenti.
+
+--Oh, saranno verità sacrosante: vi dirò quello che sento e nulla più.
+Sapete voi che cosa avvenga allo zolfo quando un raggio di sole,
+attraversando il fuoco di una lente, viene a percuotergli sopra?
+
+--Credo che si accenda, ma non potrei giurarlo, perchè non m'intendo
+di fisica.
+
+--Oh, giuratelo, signora mia, giuratelo pure! Cotesto è avvenuto a me,
+dacchè voi siete entrata qui, cioè, mi spiego, da quando io mi sono
+svegliato. Voi siete il raggio di sole; l'occasione bizzarra che vi ha
+condotto qui è la lente; lo zolfo infine sono io, Roberto Fenoglio,
+avvocato, e scapolo per giunta. Siete nubile voi?
+
+--No, signore.
+
+--Ah! c'è un marito!...
+
+--Neppure; egli c'è stato.
+
+--Siete vedova, dunque! Vedova! oh dolce nome! siete vedova, e siete
+bella! Ma tutto ciò è un sogno.... Abbandonarsi all'ignoto! lasciar
+operare il caso!... L'ignoto è venuto, il caso ha operato un miracolo!
+
+--Che dite voi ora?
+
+--Lasciatemi dire, o signora; parlo col mio angelo custode. Non
+credete che io ci abbia un angelo custode? È lui che vi ha condotta
+quassù: consentite che io adori in voi i decreti della divina
+Provvidenza. E l'esservi voi dichiarata mia moglie non è forse una
+voce del cielo? La vocazione di Abramo è stata determinata da assai
+più lievi cagioni. Insomma, o signora, vengo difilato alla conclusione
+del mio discorso, che vi sarà parso sconclusionato; ma io m'intendo e
+basta. Che direste voi di un uomo non vecchio, nè al tutto sgradevole,
+e con ventimila lire di entrata senza contare uno zio materno,
+decrepito, senza figli, e con mezzo milione?
+
+--Direi,--rispose la signora che sapea stare alla celia,--ch'egli è un
+uomo fortunato.
+
+--Non mi avete inteso; mi spiegherò meglio. Che direste di quest'uomo,
+se egli vi proferisse la mano, dopo avervi umilmente chiesto la
+vostra?
+
+--Direi ch'egli è un bel pazzo, a concepire di così fatti disegni e
+più pazzo ancora a dirli a me, la prima volta che egli mi vede, e in
+una somigliante occasione.--
+
+Roberto Fenoglio chinò il capo e lasciò cader le mani penzoloni lungo
+i braccioli della scranna sulla quale era venuto a sedersi per
+cominciare il suo dialogo.
+
+--Tutte così, le donne!--esclamò egli, sospirando.
+
+--Tutte così, voi dite? e perchè di grazia?
+
+--Perchè?--ripetè con accento di amarezza Roberto Fenoglio.--Voi mi
+chiedete ancora il perchè! Perchè esse si dilettano a tormentare il
+cuore di un uomo, lo girano e rigirano per tutti i versi, scherzandovi
+su colle loro unghie feline che lacerano dovunque toccano e fanno
+spicciare il sangue. Dite loro: _vi amo_, lo dite con tutta la
+sincerità dell'anima vostra, ed elleno vi ridono sul viso con aria
+d'incredulità. Per esse l'amore non esiste che allo stato di
+vecchiezza; lo fanno nascere dalla consuetudine, vi negano ch'e' possa
+essere il risultato di una commozione subitanea. L'amore per gradi;
+che bella cosa! Ma qual è, dopo quant'altri gradi incomincia quello in
+cui si può dire _vi amo_ ed esser creduti? Io mi ribello, o signora,
+contro questa falsa teorica. Voi stessa, che la lodate palesemente,
+non ne credete in cuor vostro una jota. Ma essa vi torna acconcia per
+guadagnar tempo, per pigliarvi diletto dei nostri tormenti... Orvia,
+signora, non crollate la vostra testolina a quel modo! Lasciatevi dire
+la verità da un uomo che riceve per la prima volta la scossa
+elettrica! Io non ho amato mai, sebbene molte fiate siasi potuto
+argomentare il contrario, da certe vaghe apparenze. Questo affetto che
+io vi confesso candidamente ora, è già padrone di me. Se la cosa
+dovesse procedere diversamente, se io dovessi innamorarmi di voi a
+gradi, a gradi, avreste ragione a non usarmi misericordia, perchè io
+sarei un uomo da nulla. Come è nato questo amore? Non lo so. La novità
+del caso era fatta piuttosto per ispirarmi la diffidenza; ma non ne fu
+nulla. Se debbo confessarvi un mio sospetto, vi dirò che vi ho amato
+in quel momento che avete posto il vostro braccio sotto il mio. In
+quella dolce pressione che volea dirmi: _salvatemi_! io ne ho sentito
+un'altra che diceva: _amatemi_. Ho inteso la vostra preghiera, ho
+accettato il vostro comando; perchè una corrente elettrica mi ha
+signoreggiato ad un tratto. E subito, comunque turbato, ho messo ogni
+mia virtù a tornarvi utile. Chi, se non il cuore, mi ha detto allora
+che voi eravate una gentildonna? Sì, una gentildonna; questa
+persuasione si è trasfusa a quel contatto in tutto l'esser mio, ed io
+non ho sospettato di sapere il vostro nome per obbedirvi, come non lo
+chiedo ora, innanzi di confessarvi che vi amo. E adesso ridete pure,
+ridete liberamente di me!
+
+--Perchè riderei?--chiese la sconosciuta, con piglio soave.--A
+schietto parlare schietta risposta. Che cosa direste voi di una donna,
+la quale, alle prime parole di un uomo che ella vede per la prima
+volta, gli rispondesse: vi credo, e accettasse di grand'animo l'amor
+suo?
+
+--Direi che ella è una donna superiore a tutte le altre, o, per rubare
+una sua magnifica frase al divino Petrarca, «_colei che sola a me par
+donna_.»
+
+--No, signor Fenoglio, non lo direste, o, dicendolo, non lo
+pensereste. Se questa donna non conosce ancora quest'uomo....
+
+--Ma neppure io, o signora, conoscevo voi, e tuttavia....
+
+--Gran bella ragione!--interruppe la donna.--Vedete mo il gran risico
+che correvate voi! Ed è egli possibile che il vostro senno non vi
+dimostri la grave, la profonda differenza che corre tra un cuor d'uomo
+e un cuore di donna? Che sacrifizio fa l'uomo ad amare e a dirlo, egli
+tentatore, egli padrone di perdere nel giuoco quel tanto appena che ha
+messo di posta? Noi, povere donne, quando amiamo (il che più veramente
+ci avviene che a voi, e con più violenza di subitanea passione che voi
+non crediate) paghiamo i nostri errori col dispregio di noi medesime.
+Non parlate più? Non crollate più a vostra volta il capo, in segno di
+incredulità? Vedete pure che non avevate ragione, e, schietta come
+sono, vo' confessarvelo. Ho detto testè: _se questa donna non conosce
+ancora quest'uomo..._ e ho detto male, poichè io già vi avevo
+conosciuto, sebbene da mezz'ora, più addentro che se la nostra
+conoscenza già contasse anni di vita. Siete un galantuomo e un
+gentiluomo, ed io vi ho veduto alla prova. Credete pure che io so
+rendervi giustizia! Noi povere donne non possiamo parlare liberamente
+come voi fate.... E per legge di natura, e per vincolo di educazione,
+noi siamo il sesso debole; non abbiamo altra arma migliore in nostra
+difesa che la diffidenza, la eterna diffidenza.
+
+--Il sesso debole!--soggiunse Roberto.--Siamo noi il sesso debole!
+
+--Quando ci amate, s'intende. Ma dura così poco in voi, questo stato
+di malattia! La convalescenza è sempre assai pronta, e ripigliate
+sempre le forze smarrite.--
+
+Roberto Fenoglio rimase muto. Era quella la più eloquente risposta che
+egli potesse dare alla sconosciuta. Ella aveva ragione sulle generali,
+e sebbene egli non avesse torto nel suo caso particolare, non era
+quello il momento per costringerla a riconoscerlo.
+
+Perciò, tacendo egli, v'ebbe un tratto di pausa nel dialogo. Roberto,
+colla fronte china, contava i pezzettini di marmo del suo pavimento a
+mosaico; la signora guardava Roberto, aspettando che dicesse qualcosa.
+
+E così guardandolo, e vedendolo silenzioso, le scese inavvertita in
+cuore quella pietà traditora che è sorella dell'amore e che non ha
+altro ufficio se non questo, di aprir l'uscio di casa al fratello.
+
+--Povero giovine!--le susurrava al cuore la pietà.--Tu gli hai detto
+di brutte cose, ed egli non ardisce nemmanco risponderti. Vedi com'è
+contrito ed umiliato! Ora, lo hanno detto le sacre carte: _cor
+contritum et humiliatum Deus non despiciet_. Egli ha una cera
+simpatica, per verità! E poi, com'è gentile di modi! Come si è
+adoperato volenterosamente a farti servizio! Quanti altri uomini, nel
+caso suo si sarebbero diportati com'egli? Quanti altri, posti con una
+donna sola, sconosciuta, in casa loro, non avrebbero piuttosto ceduto
+a diverso consiglio? Gli uomini, in genere, sono un'assai brutta
+razza, animi volgari, carne impastata di fango.... Ma egli! povero
+giovine! Suvvia, bisogna ricompensarlo con una dolce parola!--
+
+E la cercò, la dolce parola; ma lì, sulle prime, non le venne fatto
+trovarla. Trovò bensì un più soave accento e un più soave sorriso, per
+dirgli:
+
+--Or dunque, signor Fenoglio, voi sarete il mio cavaliere, per
+accompagnarmi a casa. Non è egli vero?
+
+--Come vorrete, o signora, come vorrete. Vado subito a levarmi di
+dosso queste ridicole insegne di mandarino cinese e sono ai vostri
+comandi. Ma innanzi di partire udite ancora una parola, e sarà
+l'ultima, ve lo giuro!
+
+--Con che aria mi dite voi questo!--rispose la signora.--Siate più
+gaio, ve ne prego; amo meglio udirvi a scherzare, come poco fa, che
+parlar malinconico e guardarmi accigliato, come ora.
+
+--Perdonatemi,--disse Roberto,--ma non posso far forza al mio
+naturale. Sotto la forma di uno scherzo vi ho detto poco fa tutto
+quello che il mio cuore sentiva. Vi ho profferto sinceramente e
+prontamente la mia mano, perchè aveste a scorgere sulle prime la
+purità de' miei intendimenti. Era quello il primo omaggio che io
+dovevo rendere ad una donna come voi, al primo momento che sentivo di
+amarla. Voi mi avete tolto in quella vece per un uomo leggero, per un
+di quei capi scarichi che s'innamorano al primo uscio; ed ecco, io
+porto la pena di aver fatto un giusto proposito e di non averne subito
+dichiarato le lodevoli ragioni....
+
+--Ah signore! E credete voi che io non le abbia pensate, tutte queste
+cose gentili? Andate, andate a mutar abiti, senza fantasticare più
+altro, poichè davvero stillandovi in questa guisa il cervello, non
+siete più giusto, nè con voi, nè con me.
+
+--Vado, signora, vado; ma ditemi ancora... io vi accompagnerò a casa!
+me ne tornerò senza un conforto nel mio solitario quartierino da
+scapolo.... E quei due che mi sanno ammogliato... che lo andranno a
+ridire....
+
+--È vero!--esclamò la sconosciuta, lasciando cadere la sua testolina
+leggiadra contro la spalliera della poltrona.--Non ci avevo pensato!
+Mi fate adesso riconoscere quanto io abbia operato sconsideratamente
+con voi. Oh quanto me ne duole!--
+
+E l'espressione del volto di quella donna fu così melanconica, nel
+pronunciar ch'ella fece quel suo _me ne duole_, che Roberto Fenoglio
+cadde ginocchioni a' suoi piedi, e, prendendola per mano, si fece a
+dirle con accento concitato:
+
+--Non vi addolorate, per carità! Ho detto una sciocchezza.... Ma dove
+diamine l'ho pescata io! Piuttosto che vedervi piangere, mi ucciderei.
+La gente dirà quel che vuole... mi crederà ammogliato; non me ne
+importa; mi condannerò ad un eterno celibato, e non sarà un grave
+sacrifizio per me, dopo quello che vi avrò fatto, di non riuscirvi
+altrimenti molesto. Veduta voi, quale altra donna al mondo amerei?--
+
+La pietà traditora inumidì leggermente le ciglia della sconosciuta.
+
+--Avvocato,--disse ella con piglio di leggiadra dimestichezza,--voi mi
+accompagnerete; saprete dove sto, ed io vi annunzio fin d'ora che sarà
+sempre aperta per un gentiluomo pari vostro la casa di Laura
+Moneglia....--
+
+La folgore, cascata ai piedi di Roberto, non gli avrebbe fatto più
+senso di quel nome e di quel casato che uscivano soavemente dalle
+labbra della sua ospite leggiadra.
+
+--Che?--gridò egli, balzando in piedi.--La cugina di Felicino
+Magnasco?
+
+--Conoscete mio cugino?--dimandò la signora Laura.
+
+--Se lo conosco, signora... se lo conosco.... Figuratevi! egli era qui
+seduto su quella medesima poltrona, mezz'ora innanzi che giungeste
+voi, e mi stava pregando... mi stava dicendo.... Insomma, oggi stesso
+e' doveva presentarmi a voi.
+
+--A me? voi? Ah, mi ricordo... mi parlò di un signore, suo amico....
+Sicuramente. Infatti il vostro nome non mi giungeva nuovo. Mio cugino
+Magnasco parla molto bene, e meritamente, di voi. Orbene, che male c'è
+che io sia sua cugina?
+
+--C'è, o signora, che voi... già lo sapete... Felicino vi ama....
+
+--Orbene, che mi ami!
+
+--Ah! sta bene?--dimandò sbigottito Roberto.
+
+--Si, certo, ma io non amo lui.--
+
+A Roberto Fenoglio fu per balzar fuori un sospiro di contentezza; ma
+si rattenne in tempo.
+
+--Lo amerete più tardi;--si provò a dir egli.--Vi piegherete a' suoi
+voti, alle sue preghiere. Felicino è un bel giovane, ha un ottimo
+cuore....
+
+--Tutto ciò che vorrete,--rispose la signora Laura,--ma egli non mi
+piace oggi, e non mi piacerà domani, nè poi.
+
+--Egli sta fresco, allora, il mio povero amico; ma cotesto non potrà
+giovarmi, non farà crescere d'un punto le mie speranze, dopo la
+promessa che gli ho fatta....
+
+--Che promessa?
+
+--Faccio male a dirvelo? Mi pare di no, poichè intanto avevate a
+saperlo!... Di aiutarlo presso la sua divina parente, di persuaderla a
+concedergli la sua mano.
+
+--Ah! ah! un mirabile spediente! E come lo ha scelto bene tra
+tutti!--gridò Laura, ridendo a più non posso.
+
+--Signora, e perchè?
+
+--Ma si, lasciatemi ridere per carità! Si vede che il mio cuginetto è
+molto perspicace.
+
+--Signora, io non so... non so se debba imbronciarmi o ridere con voi.
+
+--Si, ridete, ridete! Tutta questa gaiezza non ha nulla che possa
+recare offesa al vostro carattere, ve lo giuro!
+
+--Mi fido di voi, bella signora, e rido anche io. Povero Felicino!
+
+--Orvia, si fa tardi; andate a vestirvi.
+
+--Sì, avete ragione; questa volta vado subito. Due minuti, e torno.--
+
+Uscito Roberto dal salotto, Laura rimase sola a pensare. Che cosa
+pensasse non vi dirò, poichè non sono mai penetrato nel cuore d'una
+donna.
+
+Dieci minuti dopo, Roberto Fenoglio ricompariva nel salotto, vestito
+da cristiano, col suo abito nero di gala, il pastrano sul braccio e lo
+staio in mano. Come avesse potuto spicciarsi a quel modo non saprei
+dirvi. So che l'amore fa miracoli a palate, e non mi stupisco di
+questo.
+
+
+
+
+V.
+
+
+Il mio protagonista, levandosi di dosso quegli abiti da cinese,
+tornava quel che era, un simpatico giovinotto, se pure può dirsi
+giovinotto chi ha passata di anni parecchi la fatale trentina. La
+signora Laura lo guardò e i suoi occhi manifestarono una lieta
+maraviglia. E invero la cosa non poteva essere diversa, poichè
+l'avvocato Fenoglio, oltre all'avere un gentile aspetto, era
+innamorato cotto; e l'amore, come tutti sanno (e se qualcheduno nol
+sapesse, glielo dico io), abbellisce la gente, sia che conferisca più
+vivacità allo sguardo, sia che impallidisca le guancie, secondo che è
+lieto, o sfortunato per coloro che l'hanno nel cuore.
+
+Quello di Roberto Fenoglio non potea dirsi ancora nè una cosa, nè
+l'altra; era fresco di un'ora, ma era nato vigoroso come Ercole, di
+cui narra la favola che, stando in cuna, strozzasse colle sue poderose
+manine i serpenti. Il desiderio di piacere a quella bellissima donna,
+il rispetto che sentiva per lei, sebbene l'avesse conosciuta in così
+strana maniera, la stranezza medesima del caso che metteva, sto per
+dire, un pizzico di sale su quel negozio, già di per sè saporito
+abbastanza, tutto ciò trasfigurava Roberto Fenoglio. Se non temessi di
+farmi dare dell'eretico, direi che quello era il suo Tabor, e che
+intorno alle tempie egli ci aveva un'aureola.
+
+--Dunque, signora,--diss'egli accompagnando le parole con un
+grandissimo inchino,--poichè così volete, andiamo; io sono ai vostri
+comandi.
+
+--Voi siete un gentil cavaliere!--rispose la signora Laura.--Andiamo
+dunque; mi sa mill'anni d'essere a casa mia.
+
+--Questa sarebbe casa vostra, se voi voleste, o signora....
+
+--Pazzo!--interruppe ella, e temperò la frase con un divino
+sorriso.--Di ciò mi parlerete più tardi....--
+
+Così dicendo ella seguì Roberto Fenoglio nell'anticamera fino alla
+porta.
+
+E qui avvenne un caso mirabile, strano, bizzarro, non mai più udito,
+nè visto; un caso che io potrei darvi ad indovinare alle cento, alle
+mille, alle diecimila, ma tanto e tanto non vi apporreste al vero; un
+caso che parrà inverosimile, e che infatti è inverosimile davvero,
+come è spesso inverosimile la verità.
+
+Non vi è egli mai avvenuto, o lettori, di vedere un tramonto di sole,
+di notarne gli strani colori, i più strani effetti di luce, e dire tra
+voi che, se un pittore lo copiasse fedelmente, gli darebbero
+dell'esagerato? Non vi è egli mai occorso di udire un fatto, o non
+avete nella vostra storia particolare un caso tanto bislacco da farvi
+dire, quando ve ne ricordate, che se un romanziere lo raccontasse, non
+parrebbe vero a nessuno?
+
+Orbene, uno di questi casi occorse per l'appunto ai miei due
+personaggi; uno di questi tramonti toccò alla mia narrazione, la quale
+non è un sole pur troppo!
+
+Roberto avea posto la mano sulla chiave e faceva girar la stanghetta
+per aprire. In quel punto, proprio in quel punto, si udiva una forte
+scampanellata. Egli, sebbene quel suono improvviso gli urtasse
+maledettamente i nervi, non fu più in tempo a fermarsi. L'uscio si
+apriva sotto le sue mani, e un uomo si presentava nel vano. Questo
+uomo fu sollecito ad entrare, e la prima persona che egli ebbe a
+vedere (poichè Roberto, nello aprir l'uscio, si cansava per darle il
+passo) fu la bellissima Laura Moneglia.
+
+Chi era costui? Perchè al veder quella donna e' dava uno sbalzo
+indietro, spalancando tanto d'occhi a guisa di spiritato?
+
+Era Felicino Magnasco, che vedeva innanzi a sè la sua crudele cugina.
+
+Fu un colpo di scena che io non vi starò a descrivere, e di certo non
+potrei se pur lo volessi. Il fatto, l'atto istantaneo, non si dipinge;
+lo scrittore non può mutarsi in fotografo.
+
+Felicino Magnasco entrò coll'aria più impacciata che vi possiate
+immaginare, e ne aveva ben donde. Roberto Fenoglio non lo era meno di
+lui.
+
+--Oh, buon giorno, Felicino!--esclamò egli, senza sapere che cosa si
+dicesse.--Che buon vento ti porta quassù? Come va la salute?
+
+--Bene, grazie; e la tua?
+
+--_Optime_, Felicino, optime; e che cosa mi frutta una tua visita così
+mattiniera?
+
+--Ah sì!...--rispose l'altro.--È un'ora indebita... giungo in mal
+punto....
+
+--Ma no, Felicino, ma no... figurati! un amico come sei tu giunge
+sempre gradito.
+
+--Grazie da capo; ma lasciatemi raccapezzare...--soggiunse Magnasco.
+
+--Sì, raccapezziamoci, vuoi sederti un tratto? Signora....--
+
+La signora Laura intese com'egli le chiedesse licenza di fermarsi
+ancora qualche minuto, e fe' per tornare nel salotto.
+
+--Oh, mi rincresce di recar fastidio....--ripigliò Felicino,--ma
+proprio non capisco... non ricordo più perchè io sia tornato
+quassù....--
+
+E il povero Magnasco, cavato di tasca il fazzoletto, si andava
+asciugando il sudore che gli gocciolava in copia dalla fronte.
+
+--Ecco...,--diss'egli, come furono nel salotto,--mi ricordo.... Appena
+ti ho lasciato, son corso verso casa.... Ma ho trovato degli amici
+sotto i portici del teatro Carlo Felice, che uscivano da cena.... Essi
+mi hanno trattenuto colle loro chiacchiere.... Poi, sono andato a
+casa... ma giunto a mezza scala, mi avvedo che ho dimenticata la
+chiave. Dove posso averla lasciata, se iersera l'avevo? Allora ho
+pensato che il mio pastrano l'avevo riposto nella tua anticamera, e
+che per conseguenza.... Ma permettimi, vo subito a vederci; di certo
+la è cascata in qualche cantuccio....--
+
+E senza aspettar altro, Felicino Magnasco, che non aveva ancora alzati
+gli occhi verso la sua cugina, uscì a precipizio dal salotto.
+
+--Or bene, che si fa?--chiese Roberto alla signora Laura.
+
+--Che si fa?--rispose ella.--Raccontargli.... È il partito migliore.
+
+--Oh no, signora, nemmeno per sogno!--disse Roberto.--Egli crederà che
+lo si voglia ingannare. Non c'è di peggio che la verità. E poi avete
+voi un gran tornaconto a scolparvi con lui? Già voi lo amate?
+
+--Ma che! vi pare?
+
+--Dunque....
+
+--Dunque, ditegli ciò che vorrete.
+
+--Ampia facoltà?...
+
+--Pieni poteri.--
+
+Era tempo che s'intendessero; Felicino tornava nel salotto.
+
+--Ecco la chiave!--gridò egli, entrando col prezioso arnese tra le
+dita.--Essa era a terra, di costa al tavolino.
+
+--Anch'io ho trovato la mia!--borbottò Roberto Fenoglio, guardando di
+sott'occhi madonna Laura.
+
+Quindi, fattasi scorrere la palma della mano sulla fronte, come un
+uomo che ha presa una deliberazione, entrò a parlare in tal guisa.
+
+--Felicino, amico mio, ti presento mia moglie!
+
+--Tua moglie!--
+
+Questo grido uscì dalla bocca di Felicino Magnasco, come il «_tu
+quoque, Brute, fili mi_?» dalla bocca di Cesare. In quel grido si
+distingueva la meraviglia, l'ironia, il rimprovero, e Dio sa quante
+altre cose ancora!
+
+Roberto Fenoglio non s'era vantato oltre i suoi meriti, dicendo com'ei
+fosse nato per far l'oratore. Il discorso che gli venne fuori in
+quella difficilissima occasione, comunque spezzato dalle necessità del
+dialogo, lo ha collocato (nella mia stima, s'intende) all'altezza di
+Cicerone e di Demostene.
+
+--Felicino,--diss'egli, con accento grave che dimandava altrettanta
+gravità dal suo uditore,--ricapitoliamo, e t'avvedrai di non poter
+darmi il torto.
+
+--Ah, vedremo!--rispose Magnasco.
+
+--Sicuro, vedremo, e da senno, non già per mo' d'ironia, come tu dici.
+E prima di tutto, che cosa sapevo io de' tuoi disegni matrimoniali con
+tua cugina? Innanzi che la signora Laura Moneglia diventasse la
+signora Laura Fenoglio, potevo io prevedere che un amico mio l'avrebbe
+un giorno chiesta in matrimonio? ed anco pensandolo in anticipazione,
+dovevo far io, era egli ragionevole di chiedermi il sovrumano
+sacrifizio di rinunziare alla sua mano... che è così bella? Tu non
+sarai così crudele da aver di cosiffatte pretensioni, Felicino mio,
+non è egli vero? Tu non vorrai inoltre negli amici tuoi, per atto di
+amicizia, il dono della profezia!
+
+--No certo, io non pretendo tanto.
+
+--Or bene? che colpa puoi tu fare a me, se ho sposato la tua leggiadra
+e nobilissima cugina... se un matrimonio clandestino....
+
+--Ma, signore...--entrò a dir Laura con aria turbata.
+
+--Or bene?--disse voltandosi a lei, Roberto Fenoglio.--E i pieni
+poteri?--E nell'accento, come nello sguardo di Roberto, c'era tanta
+malinconia, che madonna Laura si diè quasi per vinta, e ricadde colla
+sua bella testolina inerte sulla poltrona.
+
+Roberto Fenoglio proseguì volgendosi all'amico Magnasco:
+
+--Io te lo ripeto, che colpa ci ho? Stanotte tu mi cogli alla
+sprovveduta, mi tiri un colpo a bruciapelo, chiedendomi di renderti
+servizio presso la tua signora cugina.... Io casco dalle nuvole....
+Non so risponderti... non so dirti, spiattellarti la verità... piglio
+tempo, per aspettare il tuo ritorno e raccontarti a mente serena ogni
+cosa... ma ecco, tu capiti cinque ore prima; mi trovi solo colla mia
+signora... che colpa ci ho io?
+
+--Sta bene;--rispose Felicino, mettendo fuori le parole a stento,--ma
+tutto ciò non è molto chiaro. A qual pro un matrimonio clandestino?
+
+--Ah, per cotesto ti assicuro, Felicino, che ci abbiam avute le nostre
+gran ragioni. Io te lo dirò poi.... se la mia signora consentirà.
+
+--Felice, io vi giuro....--incominciò la signora Laura.
+
+--Che se non fosse mia moglie,--proseguì prontamente Roberto, dandole
+sulla voce con molta accortezza,--tu non l'avresti colta in casa mia,
+sola, a notte inoltrata.
+
+--Mi congratulo con gli sposi!--soggiunse Felicino colla sua aria
+imbronciata.--Ma ormai non ci sarà più ragione a nascondere il fatto,
+e tu farai pubblica la nuova delle tue contentezze.
+
+--Sì, certo, domani stesso; le ragioni che ci hanno fatto tacere e
+dissimulare fin qui, son cessate; non è egli vero, Laura?
+
+--Voi siete crudele!--mormorò la signora.
+
+--Vi ho già detto,--soggiunse egli, curvando la persona verso di lei
+per parlarle a mezza voce,--che la verità non sarebbe stata creduta.
+
+--Mi accorgo,--notò Felicino,--che ci avete delle tenerezze a dirvi, e
+me ne vado. Già non ho sonno, e andrò a fare una cavalcata. Hai veduto
+il mio baio, Fenoglio?
+
+--Sì, un bell'animale; ma aspetta, usciamo anche noi.--
+
+Il bel cuginetto diede una girata sui tacchi, e se ne andò ad ammirare
+un quadro appiccato all'opposta parete.
+
+Madonna Laura, a sentirlo parlare come aveva fatto allora, fu
+costretta a pensare che il suo cugino non si pigliava po' poi grande
+rammarico della sua perdita.
+
+Felicino era un uomo del suo secolo, o per dir meglio, del suo mezzo
+secolo. Il decimonono va diviso in due periodi; il primo è di _Jacopo
+Ortis_; il secondo di.... manca il nome, perchè ancora manca il libro,
+ma i lettori capiscono.
+
+Intanto Roberto conduceva la signora Laura verso la strombatura di una
+finestra.
+
+--Signora, vi chiedo scusa, ma già ve lo avevo detto.
+
+--Sì, sì, ho inteso; m'avete reso pan per
+focaccia.
+
+--Accettate il mio pane?
+
+--Ne parleremo più tardi.
+
+--No; ora io debbo mutar registro con vostro cugino. La verità, detta
+adesso, senza ch'egli possa sospettare che si voglia mendicar pretesti
+con lui, può essere, deve essere creduta.
+
+--Ma, signore....
+
+--Signora....--
+
+Dicendo questa parola, Roberto aveva le lagrime agli occhi. Laura se
+ne addiede, e gli stese affettuosamente la mano.
+
+--Ah!--gridò egli balzando una spanna da terra.
+
+--Che cosa c'è?--chiese Felicino, voltandosi indietro.
+
+--C'è, Felicino mio, che la tua bella cugina non è altrimenti mia
+moglie.
+
+--Come? che dici tu?
+
+--Cioè.... mi correggo.... non lo è ancora, ma lo sarà tra breve.
+Perdonami, Felicino, ma la gioia mi soffoca. Io non conoscevo tua
+cugina. Un caso, nota, un mero caso l'ha condotta qua, questa notte,
+per l'uscio che tu, nell'andartene hai lasciato aperto....
+
+--Ah, diamine!
+
+--Sì, tutto ciò sarebbe troppo lungo a narrarsi ora, ma lo saprai per
+filo e per segno più tardi. Il fatto sta che un tessuto di bizzarre
+avventure ci ha condotto a questo punto, e che adesso, per la prima
+volta, la mia divina fidanzata mi ha sporto la mano.
+
+--Adesso!--esclamò Felicino stupefatto.
+
+--Adesso, mentre tu stavi guardando quella incisione del Morghen, che
+io ti regalo, se la ti va a genio.
+
+--No, grazie; non saprei dove metterla.
+
+--Come ti piace; ma dimmi, che ora fai?
+
+--Che domanda balzana!
+
+--Per carità, Felicino, te ne prego, che ora fai? Felicino guardò
+l'oriuolo.
+
+--Le sei e un quarto!--diss'egli--sei rappattumato cogli orologi?
+
+--Sì, Felicino mio; ne comprerò dieci, venti, trenta, ne riempirò
+tutte le camere, tutti i bugigattoli di casa; ma tutti segneranno le
+sei e un quarto, eternamente le sei e un quarto.
+
+--Bravo!--soggiunse Magnasco, sforzandosi a sorridere e non venendo a
+capo che di fare una smorfia.--Così non ti seccheranno col loro _tran
+tran_.
+
+--Certamente; _tu dixisti_! A proposito del _tran_ _tran_, sai tu,
+Felicino, che m'hai fatto un vero regalo colla tua teoria dell'ignoto,
+del dio Caso e del ragionare coi piedi? Senza quel tuo discorso
+eminentemente filosofico, io sarei andato a letto, in cambio di
+starmene sdraiato su questo canapè ad aspettare l'ignoto. L'ignoto non
+sarebbe venuto senza quell'uscio che tu lasciasti aperto, e il dio
+Caso non avrebbe potuto rompere la monotonia dei miei giorni.
+Felicino, amico mio; una stretta di mano, e non aver rancore contro il
+tuo amico, se gli è stamane più felice di te. Ah, che cosa ne dici di
+questo?
+
+--Grazioso, e me lo merito! Ma tu mi
+racconterai....
+
+--Sì, tutto.... se la mia bella fidanzata lo consentirà.
+
+--Perchè no?--soggiunse madonna Laura.--Qui non c'è nulla che non si
+possa raccontare. Ma andiamo, che già gli è giorno chiaro.
+
+--Cugina,--disse Felicino Magnasco,--mi permettete di offrirvi il
+braccio? Il mio Roberto non ne sarà mica geloso?
+
+--Oh, spero di no!--rispose ella, volgendo a Roberto una di quelle
+occhiate che solo le donne sanno dare, e nelle grandi occasioni.
+
+
+
+
+VI.
+
+
+Lettrici e lettori, qui la mia storia sarebbe finita; ma perchè non
+abbiate a dire che io vi ho piantati sul più bello, aggiungerò ancora
+poche note, a guisa di epilogo.
+
+E _in primis_ vi dirò che, quaranta giorni appresso, Laura Moneglia,
+la leggiadra vedova (vedova di due mesi di matrimonio con un decrepito
+zio) andava a seconde nozze, anzi a prime, coll'avvocato Roberto
+Fenoglio.
+
+La cerimonia fu fatta nella aristocratica chiesa della Maddalena.
+C'erano parecchi amici, e tra essi Felicino Magnasco, il quale aveva
+finalmente saputo tutti i particolari di quella notte bizzarra, e
+ancora non potea darsene pace.
+
+Gli sposi, appena ebbero detto il dolcissimo sì, partirono alla volta
+della campagna. Non talentava loro di andare a Parigi, nè a Londra, nè
+cullare i primi giorni di amore tra la polvere delle strade maestre,
+l'ingombro delle valigie e la inevitabile filatessa prosaica delle
+mille necessità di viaggio, nè far confidente di susurrati discorsi
+leggiadri il cortinaggio ristucco di un letto di locanda.
+
+Se ne andarono in quella vece ad una villeggiatura di Roberto, posta
+mirabilmente su di una collina, di rincontro al mare, graziosa
+palazzina di due piani, contornata di fiori, con due falde di vigneti
+e di boscaglie, i vigneti a solatìo, le boscaglie a bacìo. I primi
+tepori della primavera rinverdivano la natura, smaltando di gaie tinte
+il fondo del più bel quadro d'amore che mai potesse immaginare una
+mente d'artista.
+
+Colassù non vedevano alcuno, nè d'alcuno avevano, o cercavano,
+notizia. Giungevano lettere e le lasciavano chiuse nella sopraccarta;
+i giornali s'affastellavano sui canterani, accanto alla parete, colla
+fascia intatta.
+
+Come fu passato un mese di quella vita, si ricordarono un giorno che
+avevano promesso di tornare a Genova: ma se ne ricordarono per
+guardarsi in viso, ridendo, e dirsi a vicenda che amici e congiunti
+potevano aspettarli ancora un bel pezzo.
+
+Insomma, ve l'ho a dire? non si mossero per tutta l'estate, e
+sarebbero anco rimasti fino a tardo autunno, se la signora Laura non
+avesse proprio dovuto andare in città, per certi apprestamenti che
+l'accorta lettrice indovina....
+
+Il dì della partenza, scesero la collina a passi lenti.... Ella non
+era così leggiadra come il primo giorno che era salita lassù, e aveva
+bisogno d'un saldo appoggio al braccio di Roberto.
+
+Ella e lui, si voltavano indietro ad ogni passo, per guardare il loro
+bel nido, che splendeva di rincontro al sole, e andavano ripetendo a
+vicenda: «Torneremo? torneremo questa primavera. Oh come ci parrà
+lungo il tempo!»
+
+E tornarono; ci tornarono tutti gli anni seguenti, e ci torneranno
+quest'altro, innamorati come prima, circondati dalla più vispa, dalla
+più ricciuta e dalla più leggiadra famigliuola, che abbia mai potuto
+desiderare, nei suoi sogni di paternità, il vostro umilissimo servo.
+
+
+
+FINE.
EOT;
+
+ /*
+ End of Project Gutenberg's Una notte bizzarra, by Anton Giulio Barrili
+
+ *** END OF THIS PROJECT GUTENBERG EBOOK UNA NOTTE BIZZARRA ***
+
+ ***** This file should be named 29636-8.txt or 29636-8.zip *****
+ This and all associated files of various formats will be found in:
+ http://www.gutenberg.org/2/9/6/3/29636/
+
+ Produced by Claudio Paganelli, Carlo Traverso and the
+ Online Distributed Proofreading Team at http://www.pgdp.net
+ (This file was produced from images generously made
+ available by The Internet Archive/Canadian Libraries)
+
+ Updated editions will replace the previous one--the old editions
+ will be renamed.
+
+ Creating the works from public domain print editions means that no
+ one owns a United States copyright in these works, so the Foundation
+ (and you!) can copy and distribute it in the United States without
+ permission and without paying copyright royalties. Special rules,
+ set forth in the General Terms of Use part of this license, apply to
+ copying and distributing Project Gutenberg-tm electronic works to
+ protect the PROJECT GUTENBERG-tm concept and trademark. Project
+ Gutenberg is a registered trademark, and may not be used if you
+ charge for the eBooks, unless you receive specific permission. If you
+ do not charge anything for copies of this eBook, complying with the
+ rules is very easy. You may use this eBook for nearly any purpose
+ such as creation of derivative works, reports, performances and
+ research. They may be modified and printed and given away--you may do
+ practically ANYTHING with public domain eBooks. Redistribution is
+ subject to the trademark license, especially commercial
+ redistribution.
+
+ *** START: FULL LICENSE ***
+
+ THE FULL PROJECT GUTENBERG LICENSE
+ PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK
+
+ To protect the Project Gutenberg-tm mission of promoting the free
+ distribution of electronic works, by using or distributing this work
+ (or any other work associated in any way with the phrase "Project
+ Gutenberg"), you agree to comply with all the terms of the Full Project
+ Gutenberg-tm License (available with this file or online at
+ http://gutenberg.org/license).
+
+ Section 1. General Terms of Use and Redistributing Project Gutenberg-tm
+ electronic works
+
+ 1.A. By reading or using any part of this Project Gutenberg-tm
+ electronic work, you indicate that you have read, understand, agree to
+ and accept all the terms of this license and intellectual property
+ (trademark/copyright) agreement. If you do not agree to abide by all
+ the terms of this agreement, you must cease using and return or destroy
+ all copies of Project Gutenberg-tm electronic works in your possession.
+ If you paid a fee for obtaining a copy of or access to a Project
+ Gutenberg-tm electronic work and you do not agree to be bound by the
+ terms of this agreement, you may obtain a refund from the person or
+ entity to whom you paid the fee as set forth in paragraph 1.E.8.
+
+ 1.B. "Project Gutenberg" is a registered trademark. It may only be
+ used on or associated in any way with an electronic work by people who
+ agree to be bound by the terms of this agreement. There are a few
+ things that you can do with most Project Gutenberg-tm electronic works
+ even without complying with the full terms of this agreement. See
+ paragraph 1.C below. There are a lot of things you can do with Project
+ Gutenberg-tm electronic works if you follow the terms of this agreement
+ and help preserve free future access to Project Gutenberg-tm electronic
+ works. See paragraph 1.E below.
+
+ 1.C. The Project Gutenberg Literary Archive Foundation ("the Foundation"
+ or PGLAF), owns a compilation copyright in the collection of Project
+ Gutenberg-tm electronic works. Nearly all the individual works in the
+ collection are in the public domain in the United States. If an
+ individual work is in the public domain in the United States and you are
+ located in the United States, we do not claim a right to prevent you from
+ copying, distributing, performing, displaying or creating derivative
+ works based on the work as long as all references to Project Gutenberg
+ are removed. Of course, we hope that you will support the Project
+ Gutenberg-tm mission of promoting free access to electronic works by
+ freely sharing Project Gutenberg-tm works in compliance with the terms of
+ this agreement for keeping the Project Gutenberg-tm name associated with
+ the work. You can easily comply with the terms of this agreement by
+ keeping this work in the same format with its attached full Project
+ Gutenberg-tm License when you share it without charge with others.
+
+ 1.D. The copyright laws of the place where you are located also govern
+ what you can do with this work. Copyright laws in most countries are in
+ a constant state of change. If you are outside the United States, check
+ the laws of your country in addition to the terms of this agreement
+ before downloading, copying, displaying, performing, distributing or
+ creating derivative works based on this work or any other Project
+ Gutenberg-tm work. The Foundation makes no representations concerning
+ the copyright status of any work in any country outside the United
+ States.
+
+ 1.E. Unless you have removed all references to Project Gutenberg:
+
+ 1.E.1. The following sentence, with active links to, or other immediate
+ access to, the full Project Gutenberg-tm License must appear prominently
+ whenever any copy of a Project Gutenberg-tm work (any work on which the
+ phrase "Project Gutenberg" appears, or with which the phrase "Project
+ Gutenberg" is associated) is accessed, displayed, performed, viewed,
+ copied or distributed:
+
+ This eBook is for the use of anyone anywhere at no cost and with
+ almost no restrictions whatsoever. You may copy it, give it away or
+ re-use it under the terms of the Project Gutenberg License included
+ with this eBook or online at www.gutenberg.org
+
+ 1.E.2. If an individual Project Gutenberg-tm electronic work is derived
+ from the public domain (does not contain a notice indicating that it is
+ posted with permission of the copyright holder), the work can be copied
+ and distributed to anyone in the United States without paying any fees
+ or charges. If you are redistributing or providing access to a work
+ with the phrase "Project Gutenberg" associated with or appearing on the
+ work, you must comply either with the requirements of paragraphs 1.E.1
+ through 1.E.7 or obtain permission for the use of the work and the
+ Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or
+ 1.E.9.
+
+ 1.E.3. If an individual Project Gutenberg-tm electronic work is posted
+ with the permission of the copyright holder, your use and distribution
+ must comply with both paragraphs 1.E.1 through 1.E.7 and any additional
+ terms imposed by the copyright holder. Additional terms will be linked
+ to the Project Gutenberg-tm License for all works posted with the
+ permission of the copyright holder found at the beginning of this work.
+
+ 1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm
+ License terms from this work, or any files containing a part of this
+ work or any other work associated with Project Gutenberg-tm.
+
+ 1.E.5. Do not copy, display, perform, distribute or redistribute this
+ electronic work, or any part of this electronic work, without
+ prominently displaying the sentence set forth in paragraph 1.E.1 with
+ active links or immediate access to the full terms of the Project
+ Gutenberg-tm License.
+
+ 1.E.6. You may convert to and distribute this work in any binary,
+ compressed, marked up, nonproprietary or proprietary form, including any
+ word processing or hypertext form. However, if you provide access to or
+ distribute copies of a Project Gutenberg-tm work in a format other than
+ "Plain Vanilla ASCII" or other format used in the official version
+ posted on the official Project Gutenberg-tm web site (www.gutenberg.org),
+ you must, at no additional cost, fee or expense to the user, provide a
+ copy, a means of exporting a copy, or a means of obtaining a copy upon
+ request, of the work in its original "Plain Vanilla ASCII" or other
+ form. Any alternate format must include the full Project Gutenberg-tm
+ License as specified in paragraph 1.E.1.
+
+ 1.E.7. Do not charge a fee for access to, viewing, displaying,
+ performing, copying or distributing any Project Gutenberg-tm works
+ unless you comply with paragraph 1.E.8 or 1.E.9.
+
+ 1.E.8. You may charge a reasonable fee for copies of or providing
+ access to or distributing Project Gutenberg-tm electronic works provided
+ that
+
+ - You pay a royalty fee of 20% of the gross profits you derive from
+ the use of Project Gutenberg-tm works calculated using the method
+ you already use to calculate your applicable taxes. The fee is
+ owed to the owner of the Project Gutenberg-tm trademark, but he
+ has agreed to donate royalties under this paragraph to the
+ Project Gutenberg Literary Archive Foundation. Royalty payments
+ must be paid within 60 days following each date on which you
+ prepare (or are legally required to prepare) your periodic tax
+ returns. Royalty payments should be clearly marked as such and
+ sent to the Project Gutenberg Literary Archive Foundation at the
+ address specified in Section 4, "Information about donations to
+ the Project Gutenberg Literary Archive Foundation."
+
+ - You provide a full refund of any money paid by a user who notifies
+ you in writing (or by e-mail) within 30 days of receipt that s/he
+ does not agree to the terms of the full Project Gutenberg-tm
+ License. You must require such a user to return or
+ destroy all copies of the works possessed in a physical medium
+ and discontinue all use of and all access to other copies of
+ Project Gutenberg-tm works.
+
+ - You provide, in accordance with paragraph 1.F.3, a full refund of any
+ money paid for a work or a replacement copy, if a defect in the
+ electronic work is discovered and reported to you within 90 days
+ of receipt of the work.
+
+ - You comply with all other terms of this agreement for free
+ distribution of Project Gutenberg-tm works.
+
+ 1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm
+ electronic work or group of works on different terms than are set
+ forth in this agreement, you must obtain permission in writing from
+ both the Project Gutenberg Literary Archive Foundation and Michael
+ Hart, the owner of the Project Gutenberg-tm trademark. Contact the
+ Foundation as set forth in Section 3 below.
+
+ 1.F.
+
+ 1.F.1. Project Gutenberg volunteers and employees expend considerable
+ effort to identify, do copyright research on, transcribe and proofread
+ public domain works in creating the Project Gutenberg-tm
+ collection. Despite these efforts, Project Gutenberg-tm electronic
+ works, and the medium on which they may be stored, may contain
+ "Defects," such as, but not limited to, incomplete, inaccurate or
+ corrupt data, transcription errors, a copyright or other intellectual
+ property infringement, a defective or damaged disk or other medium, a
+ computer virus, or computer codes that damage or cannot be read by
+ your equipment.
+
+ 1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right
+ of Replacement or Refund" described in paragraph 1.F.3, the Project
+ Gutenberg Literary Archive Foundation, the owner of the Project
+ Gutenberg-tm trademark, and any other party distributing a Project
+ Gutenberg-tm electronic work under this agreement, disclaim all
+ liability to you for damages, costs and expenses, including legal
+ fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
+ LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE
+ PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE
+ TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE
+ LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR
+ INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH
+ DAMAGE.
+
+ 1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a
+ defect in this electronic work within 90 days of receiving it, you can
+ receive a refund of the money (if any) you paid for it by sending a
+ written explanation to the person you received the work from. If you
+ received the work on a physical medium, you must return the medium with
+ your written explanation. The person or entity that provided you with
+ the defective work may elect to provide a replacement copy in lieu of a
+ refund. If you received the work electronically, the person or entity
+ providing it to you may choose to give you a second opportunity to
+ receive the work electronically in lieu of a refund. If the second copy
+ is also defective, you may demand a refund in writing without further
+ opportunities to fix the problem.
+
+ 1.F.4. Except for the limited right of replacement or refund set forth
+ in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER
+ WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.
+
+ 1.F.5. Some states do not allow disclaimers of certain implied
+ warranties or the exclusion or limitation of certain types of damages.
+ If any disclaimer or limitation set forth in this agreement violates the
+ law of the state applicable to this agreement, the agreement shall be
+ interpreted to make the maximum disclaimer or limitation permitted by
+ the applicable state law. The invalidity or unenforceability of any
+ provision of this agreement shall not void the remaining provisions.
+
+ 1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the
+ trademark owner, any agent or employee of the Foundation, anyone
+ providing copies of Project Gutenberg-tm electronic works in accordance
+ with this agreement, and any volunteers associated with the production,
+ promotion and distribution of Project Gutenberg-tm electronic works,
+ harmless from all liability, costs and expenses, including legal fees,
+ that arise directly or indirectly from any of the following which you do
+ or cause to occur: (a) distribution of this or any Project Gutenberg-tm
+ work, (b) alteration, modification, or additions or deletions to any
+ Project Gutenberg-tm work, and (c) any Defect you cause.
+
+
+ Section 2. Information about the Mission of Project Gutenberg-tm
+
+ Project Gutenberg-tm is synonymous with the free distribution of
+ electronic works in formats readable by the widest variety of computers
+ including obsolete, old, middle-aged and new computers. It exists
+ because of the efforts of hundreds of volunteers and donations from
+ people in all walks of life.
+
+ Volunteers and financial support to provide volunteers with the
+ assistance they need, are critical to reaching Project Gutenberg-tm's
+ goals and ensuring that the Project Gutenberg-tm collection will
+ remain freely available for generations to come. In 2001, the Project
+ Gutenberg Literary Archive Foundation was created to provide a secure
+ and permanent future for Project Gutenberg-tm and future generations.
+ To learn more about the Project Gutenberg Literary Archive Foundation
+ and how your efforts and donations can help, see Sections 3 and 4
+ and the Foundation web page at http://www.pglaf.org.
+
+ Section 3. Information about the Project Gutenberg Literary Archive
+ Foundation
+
+ The Project Gutenberg Literary Archive Foundation is a non profit
+ 501(c)(3) educational corporation organized under the laws of the
+ state of Mississippi and granted tax exempt status by the Internal
+ Revenue Service. The Foundation's EIN or federal tax identification
+ number is 64-6221541. Its 501(c)(3) letter is posted at
+ http://pglaf.org/fundraising. Contributions to the Project Gutenberg
+ Literary Archive Foundation are tax deductible to the full extent
+ permitted by U.S. federal laws and your state's laws.
+
+ The Foundation's principal office is located at 4557 Melan Dr. S.
+ Fairbanks, AK, 99712., but its volunteers and employees are scattered
+ throughout numerous locations. Its business office is located at
+ 809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email
+ business@pglaf.org. Email contact links and up to date contact
+ information can be found at the Foundation's web site and official
+ page at http://pglaf.org
+
+ For additional contact information:
+ Dr. Gregory B. Newby
+ Chief Executive and Director
+ gbnewby@pglaf.org
+
+ Section 4. Information about Donations to the Project Gutenberg
+ Literary Archive Foundation
+
+ Project Gutenberg-tm depends upon and cannot survive without wide
+ spread public support and donations to carry out its mission of
+ increasing the number of public domain and licensed works that can be
+ freely distributed in machine readable form accessible by the widest
+ array of equipment including outdated equipment. Many small donations
+ ($1 to $5,000) are particularly important to maintaining tax exempt
+ status with the IRS.
+
+ The Foundation is committed to complying with the laws regulating
+ charities and charitable donations in all 50 states of the United
+ States. Compliance requirements are not uniform and it takes a
+ considerable effort, much paperwork and many fees to meet and keep up
+ with these requirements. We do not solicit donations in locations
+ where we have not received written confirmation of compliance. To
+ SEND DONATIONS or determine the status of compliance for any
+ particular state visit http://pglaf.org
+
+ While we cannot and do not solicit contributions from states where we
+ have not met the solicitation requirements, we know of no prohibition
+ against accepting unsolicited donations from donors in such states who
+ approach us with offers to donate.
+
+ International donations are gratefully accepted, but we cannot make
+ any statements concerning tax treatment of donations received from
+ outside the United States. U.S. laws alone swamp our small staff.
+
+ Please check the Project Gutenberg Web pages for current donation
+ methods and addresses. Donations are accepted in a number of other
+ ways including checks, online payments and credit card donations.
+ To donate, please visit: http://pglaf.org/donate
+
+ Section 5. General Information About Project Gutenberg-tm electronic
+ works.
+
+ Professor Michael S. Hart is the originator of the Project Gutenberg-tm
+ concept of a library of electronic works that could be freely shared
+ with anyone. For thirty years, he produced and distributed Project
+ Gutenberg-tm eBooks with only a loose network of volunteer support.
+
+ Project Gutenberg-tm eBooks are often created from several printed
+ editions, all of which are confirmed as Public Domain in the U.S.
+ unless a copyright notice is included. Thus, we do not necessarily
+ keep eBooks in compliance with any particular paper edition.
+
+ Most people start at our Web site which has the main PG search facility:
+
+ http://www.gutenberg.org
+
+ This Web site includes information about Project Gutenberg-tm,
+ including how to make donations to the Project Gutenberg Literary
+ Archive Foundation, how to help produce our new eBooks, and how to
+ subscribe to our email newsletter to hear about new eBooks.
+ */
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/lt_LT/Person.php b/vendor/fakerphp/faker/src/Faker/Provider/lt_LT/Person.php
index 99ca87bce..c448ab814 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/lt_LT/Person.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/lt_LT/Person.php
@@ -238,7 +238,7 @@ class Person extends \Faker\Provider\Person
* @see http://www.horoskopai.lt/gaires/populiariausios-pavardes-lietuvoje/
*/
protected static $lastNameMale = [
- 'Kazlaukas', 'Jankauskas', 'Petrauskas', 'Stankevičius', 'Vasiliauskas', 'Žukauskas', 'Butkus',
+ 'Kazlauskas', 'Jankauskas', 'Petrauskas', 'Stankevičius', 'Vasiliauskas', 'Žukauskas', 'Butkus',
'Kateiva', 'Paulauskas', 'Urbonas', 'Kavaliauskas', 'Baranauskas', 'Pocius', 'Sakalauskas',
];
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/ro_RO/Person.php b/vendor/fakerphp/faker/src/Faker/Provider/ro_RO/Person.php
index d3b5a5ea2..d8ef51d00 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/ro_RO/Person.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/ro_RO/Person.php
@@ -163,12 +163,12 @@ class Person extends \Faker\Provider\Person
switch (count($dateOfBirthParts)) {
case 1:
$dateOfBirthParts[] = $baseDate->format('m');
- //don't break, we need the day also
- // no break
+ //don't break, we need the day also
+ // no break
case 2:
$dateOfBirthParts[] = $baseDate->format('d');
- //don't break, next line will
- // no break
+ //don't break, next line will
+ // no break
case 3:
break;
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/ru_RU/Company.php b/vendor/fakerphp/faker/src/Faker/Provider/ru_RU/Company.php
index 25c5c8e9d..9f5d572f4 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/ru_RU/Company.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/ru_RU/Company.php
@@ -44,6 +44,7 @@ class Company extends \Faker\Provider\Company
/**
* @see https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D1%80%D0%BE%D1%84%D0%B5%D1%81%D1%81%D0%B8%D0%B8
+ *
* @note Randomly took from this list - some jobs titles for each letter
*/
protected static $jobTitleFormat = [
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/sv_SE/PhoneNumber.php b/vendor/fakerphp/faker/src/Faker/Provider/sv_SE/PhoneNumber.php
index 01cf15d96..2d5c58821 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/sv_SE/PhoneNumber.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/sv_SE/PhoneNumber.php
@@ -2,6 +2,9 @@
namespace Faker\Provider\sv_SE;
+/**
+ * @see https://www.pts.se/sv/bransch/telefoni/nummer-och-adressering/telefoninummerplanen/telefonnummers-struktur/
+ */
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
/**
@@ -34,4 +37,28 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
'+46(0)%######',
'+46%######',
];
+
+ /**
+ * @var array Swedish mobile number formats
+ */
+ protected static array $mobileFormats = [
+ '+467########',
+ '+46(0)7########',
+ '+46 (0)7## ## ## ##',
+ '+46 (0)7## ### ###',
+ '07## ## ## ##',
+ '07## ### ###',
+ '07##-## ## ##',
+ '07##-### ###',
+ '07# ### ## ##',
+ '07#-### ## ##',
+ '07#-#######',
+ ];
+
+ public function mobileNumber(): string
+ {
+ $format = static::randomElement(static::$mobileFormats);
+
+ return self::numerify($this->generator->parse($format));
+ }
}
diff --git a/vendor/fakerphp/faker/src/Faker/Provider/tr_TR/Company.php b/vendor/fakerphp/faker/src/Faker/Provider/tr_TR/Company.php
index 1458bb862..e7b7892c1 100644
--- a/vendor/fakerphp/faker/src/Faker/Provider/tr_TR/Company.php
+++ b/vendor/fakerphp/faker/src/Faker/Provider/tr_TR/Company.php
@@ -31,6 +31,7 @@ class Company extends \Faker\Provider\Company
/**
* @see https://tr.wikipedia.org/wiki/Meslekler_listesi
+ *
* @note Randomly took 300 from this list
*/
protected static $jobTitleFormat = [
diff --git a/vendor/fruitcake/laravel-cors/.editorconfig b/vendor/fruitcake/laravel-cors/.editorconfig
deleted file mode 100644
index a7c44ddb1..000000000
--- a/vendor/fruitcake/laravel-cors/.editorconfig
+++ /dev/null
@@ -1,15 +0,0 @@
-root = true
-
-[*]
-charset = utf-8
-indent_size = 4
-indent_style = space
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.md]
-trim_trailing_whitespace = false
-
-[*.{yml,yaml}]
-indent_size = 2
diff --git a/vendor/fruitcake/laravel-cors/LICENSE b/vendor/fruitcake/laravel-cors/LICENSE
deleted file mode 100644
index 3bf912822..000000000
--- a/vendor/fruitcake/laravel-cors/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright (c) 2013-2016 Barry vd. Heuvel
-
-Copyright for portions of this project are held by [asm89 (Alexander)] as part of project asm89/stack-cors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/fruitcake/laravel-cors/changelog.md b/vendor/fruitcake/laravel-cors/changelog.md
deleted file mode 100644
index 4cf92204b..000000000
--- a/vendor/fruitcake/laravel-cors/changelog.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-## v2.0 (2020-05-11)
-
-[asm89/stack-cors 2.x](https://github.com/asm89/stack-cors/releases/tag/2.0.0) is now used, with these notable changes:
-
-### Added
-- CORS headers are better cachable now, with correct Vary headers (#https://github.com/asm89/stack-cors/pull/70, #https://github.com/asm89/stack-cors/pull/74)
-
-### Changed
-- CORS headers are added to non-Origin requests when possible (#https://github.com/asm89/stack-cors/pull/73)
-- Requests are no longer blocked by the server, only by the browser (#https://github.com/asm89/stack-cors/pull/70)
-
-## v1.0 (2019-12-27)
-
-### Breaking changes
- - Adding the middleware on Route groups is no longer supported. You can use the new `paths` option to match your routes
- - The config file has been changed from `camelCase` to `snake_case`, please update your own config.
- - The deprecated Lumen ServiceProvider has been removed.
- - There is no need to manually configure the `cors` config in Lumen.
-
-### Added
- - The `paths` option is added to match certain routes only, while still using global middleware. This allows for better error handling.
-
-## v0.11.0 (2017-12-xx)
-### Breaking changes
- - The wildcard matcher is changed. You can use `allowedOriginPatterns` for your own patterns,
- or simple wildcards in the normal origins. Eg. `*.laravel.com` should still work.
-
-## v0.9.0 (2016-03-2017)
-### Breaking changes
- - The `cors` alias is no longer added by default. Use the full class or add the alias yourself.
- - The Lumen ServiceProvider has been removed. Both Laravel and Lumen should use `Barryvdh\Cors\ServiceProvider::class`.
- - `Barryvdh\Cors\Stack\CorsService` moves to `\Barryvdh\Cors\CorsService` (namespace changed).
- - `Barryvdh\Cors@addActualRequestHeaders` will automatically attached when Exception occured.
-
-### Added
- - Better error-handling when exceptions occur.
- - A lot of tests, also on older Laravel versions.
diff --git a/vendor/fruitcake/laravel-cors/composer.json b/vendor/fruitcake/laravel-cors/composer.json
deleted file mode 100644
index 93c5cea54..000000000
--- a/vendor/fruitcake/laravel-cors/composer.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "name": "fruitcake/laravel-cors",
- "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
- "keywords": ["laravel", "cors", "crossdomain", "api"],
- "license": "MIT",
- "authors": [
- {
- "name": "Fruitcake",
- "homepage": "https://fruitcake.nl"
- },
- {
- "name": "Barry vd. Heuvel",
- "email": "barryvdh@gmail.com"
- }
- ],
- "require": {
- "php": ">=7.2",
- "illuminate/support": "^6|^7|^8|^9",
- "illuminate/contracts": "^6|^7|^8|^9",
- "asm89/stack-cors": "^2.0.1"
- },
- "require-dev": {
- "laravel/framework": "^6|^7.24|^8",
- "phpunit/phpunit": "^6|^7|^8|^9",
- "squizlabs/php_codesniffer": "^3.5",
- "orchestra/testbench-dusk": "^4|^5|^6|^7"
- },
- "autoload": {
- "psr-4": {
- "Fruitcake\\Cors\\": "src/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "Fruitcake\\Cors\\Tests\\": "tests/"
- }
- },
- "extra": {
- "branch-alias": {
- "dev-master": "2.1-dev"
- },
- "laravel": {
- "providers": [
- "Fruitcake\\Cors\\CorsServiceProvider"
- ]
- }
- },
- "scripts": {
- "test": "phpunit",
- "check-style": "phpcs -p --standard=psr12 src/",
- "fix-style": "phpcbf -p --standard=psr12 src/"
- },
- "minimum-stability": "dev"
-}
diff --git a/vendor/fruitcake/laravel-cors/config/cors.php b/vendor/fruitcake/laravel-cors/config/cors.php
deleted file mode 100644
index ea0c98bc4..000000000
--- a/vendor/fruitcake/laravel-cors/config/cors.php
+++ /dev/null
@@ -1,60 +0,0 @@
- [],
-
- /*
- * Matches the request method. `['*']` allows all methods.
- */
- 'allowed_methods' => ['*'],
-
- /*
- * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com`
- */
- 'allowed_origins' => ['*'],
-
- /*
- * Patterns that can be used with `preg_match` to match the origin.
- */
- 'allowed_origins_patterns' => [],
-
- /*
- * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers.
- */
- 'allowed_headers' => ['*'],
-
- /*
- * Sets the Access-Control-Expose-Headers response header with these headers.
- */
- 'exposed_headers' => [],
-
- /*
- * Sets the Access-Control-Max-Age response header when > 0.
- */
- 'max_age' => 0,
-
- /*
- * Sets the Access-Control-Allow-Credentials header.
- */
- 'supports_credentials' => false,
-];
diff --git a/vendor/fruitcake/laravel-cors/readme.md b/vendor/fruitcake/laravel-cors/readme.md
deleted file mode 100644
index 93f716a45..000000000
--- a/vendor/fruitcake/laravel-cors/readme.md
+++ /dev/null
@@ -1,174 +0,0 @@
-# CORS Middleware for Laravel
-
-[![Build Status][ico-actions]][link-actions]
-[![Software License][ico-license]](LICENSE.md)
-[![Total Downloads][ico-downloads]][link-downloads]
-[](https://fruitcake.nl/)
-
-Implements https://github.com/fruitcake/php-cors for Laravel
-
-## About
-
-The `laravel-cors` package allows you to send [Cross-Origin Resource Sharing](http://enable-cors.org/)
-headers with Laravel middleware configuration.
-
-If you want to have a global overview of CORS workflow, you can browse
-this [image](http://www.html5rocks.com/static/images/cors_server_flowchart.png).
-
-## Upgrading from 0.x (barryvdh/laravel-cors)
-When upgrading from 0.x versions, there are some breaking changes:
- - **A new 'paths' property is used to enable/disable CORS on certain routes. This is empty by default, so fill it correctly!**
- - **Group middleware is no longer supported, use the global middleware**
- - The vendor name has changed (see installation/usage)
- - The casing on the props in `cors.php` has changed from camelCase to snake_case, so if you already have a `cors.php` file you will need to update the props in there to match the new casing.
-
-## Features
-
-* Handles CORS pre-flight OPTIONS requests
-* Adds CORS headers to your responses
-* Match routes to only add CORS to certain Requests
-
-## Installation
-
-Require the `fruitcake/laravel-cors` package in your `composer.json` and update your dependencies:
-```sh
-composer require fruitcake/laravel-cors
-```
-
-If you get a conflict, this could be because an older version of barryvdh/laravel-cors or fruitcake/laravel-cors is installed. Remove the conflicting package first, then try install again:
-
-```sh
-composer remove barryvdh/laravel-cors fruitcake/laravel-cors
-composer require fruitcake/laravel-cors
-```
-
-## Global usage
-
-To allow CORS for all your routes, add the `HandleCors` middleware at the top of the `$middleware` property of `app/Http/Kernel.php` class:
-
-```php
-protected $middleware = [
- \Fruitcake\Cors\HandleCors::class,
- // ...
-];
-```
-
-Now update the config to define the paths you want to run the CORS service on, (see Configuration below):
-
-```php
-'paths' => ['api/*'],
-```
-
-## Configuration
-
-The defaults are set in `config/cors.php`. Publish the config to copy the file to your own config:
-```sh
-php artisan vendor:publish --tag="cors"
-```
-> **Note:** When using custom headers, like `X-Auth-Token` or `X-Requested-With`, you must set the `allowed_headers` to include those headers. You can also set it to `['*']` to allow all custom headers.
-
-> **Note:** If you are explicitly whitelisting headers, you must include `Origin` or requests will fail to be recognized as CORS.
-
-
-### Options
-
-| Option | Description | Default value |
-|--------------------------|--------------------------------------------------------------------------|---------------|
-| paths | You can enable CORS for 1 or multiple paths, eg. `['api/*'] ` | `[]` |
-| allowed_origins | Matches the request origin. Wildcards can be used, eg. `*.mydomain.com` or `mydomain.com:*` | `['*']` |
-| allowed_origins_patterns | Matches the request origin with `preg_match`. | `[]` |
-| allowed_methods | Matches the request method. | `['*']` |
-| allowed_headers | Sets the Access-Control-Allow-Headers response header. | `['*']` |
-| exposed_headers | Sets the Access-Control-Expose-Headers response header. | `false` |
-| max_age | Sets the Access-Control-Max-Age response header. | `0` |
-| supports_credentials | Sets the Access-Control-Allow-Credentials header. | `[]` |
-
-
-`allowed_origins`, `allowed_headers` and `allowed_methods` can be set to `['*']` to accept any value.
-
-> **Note:** For `allowed_origins` you must include the scheme when not using a wildcard, eg. `['http://example.com', 'https://example.com']`. You must also take into account that the scheme will be present when using `allowed_origins_patterns`.
-
-> **Note:** Try to be a specific as possible. You can start developing with loose constraints, but it's better to be as strict as possible!
-
-> **Note:** Because of [http method overriding](http://symfony.com/doc/current/reference/configuration/framework.html#http-method-override) in Laravel, allowing POST methods will also enable the API users to perform PUT and DELETE requests as well.
-
-> **Note:** Sometimes it's necessary to specify the port _(when you're coding your app in a local environment for example)_. You can specify the port or using a wildcard here too, eg. `localhost:3000`, `localhost:*` or even using a FQDN `app.mydomain.com:8080`
-
-### Lumen
-
-On Lumen, just register the ServiceProvider manually in your `bootstrap/app.php` file:
-
-```php
-$app->register(Fruitcake\Cors\CorsServiceProvider::class);
-```
-
-Also copy the [cors.php](https://github.com/fruitcake/laravel-cors/blob/master/config/cors.php) config file to `config/cors.php` and put it into action:
-
-```php
-$app->configure('cors');
-```
-
-## Global usage for Lumen
-
-To allow CORS for all your routes, add the `HandleCors` middleware to the global middleware and set the `paths` property in the config.
-
-```php
-$app->middleware([
- // ...
- Fruitcake\Cors\HandleCors::class,
-]);
-```
-
-## Common problems
-
-### Wrong config
-
-Make sure the `path` option in the config is correct and actually matches the route you are using. Remember to clear the config cache as well.
-
-### Error handling, Middleware order
-
-Sometimes errors/middleware that return own responses can prevent the CORS Middleware from being run. Try changing the order of the Middleware and make sure it's the first entry in the global middleware, not a route group. Also check your logs for actual errors, because without CORS, the errors will be swallowed by the browser, only showing CORS errors. Also try running it without CORS to make sure it actually works.
-
-### Authorization headers / Credentials
-
-If your Request includes an Authorization header or uses Credentials mode, set the `supports_credentials` value in the config to true. This will set the [Access-Control-Allow-Credentials](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials) Header to `true`.
-
-### Echo/die
-
-If you `echo()`, `dd()`, `die()`, `exit()`, `dump()` etc in your code, you will break the Middleware flow. When output is sent before headers, CORS cannot be added. When the scripts exits before the CORS middleware finished, CORS headers will not be added. Always return a proper response or throw an Exception.
-
-### Disabling CSRF protection for your API
-
-If possible, use a route group with CSRF protection disabled.
-Otherwise you can disable CSRF for certain requests in `App\Http\Middleware\VerifyCsrfToken`:
-
-```php
-protected $except = [
- 'api/*',
- 'sub.domain.zone' => [
- 'prefix/*'
- ],
-];
-```
-
-### Duplicate headers
-The CORS Middleware should be the only place you add these headers. If you also add headers in .htaccess, nginx or your index.php file, you will get duplicate headers and unexpected results.
-
-## License
-
-Released under the MIT License, see [LICENSE](LICENSE).
-
-[ico-version]: https://img.shields.io/packagist/v/fruitcake/laravel-cors.svg?style=flat-square
-[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square
-[ico-actions]: https://github.com/fruitcake/laravel-cors/actions/workflows/run-tests.yml/badge.svg
-[ico-scrutinizer]: https://img.shields.io/scrutinizer/coverage/g/fruitcake/laravel-cors.svg?style=flat-square
-[ico-code-quality]: https://img.shields.io/scrutinizer/g/fruitcake/laravel-cors.svg?style=flat-square
-[ico-downloads]: https://img.shields.io/packagist/dt/fruitcake/laravel-cors.svg?style=flat-square
-
-[link-packagist]: https://packagist.org/packages/fruitcake/laravel-cors
-[link-actions]: https://github.com/fruitcake/laravel-cors/actions
-[link-scrutinizer]: https://scrutinizer-ci.com/g/fruitcake/laravel-cors/code-structure
-[link-code-quality]: https://scrutinizer-ci.com/g/fruitcake/laravel-cors
-[link-downloads]: https://packagist.org/packages/fruitcake/laravel-cors
-[link-author]: https://github.com/fruitcake
-[link-contributors]: ../../contributors
diff --git a/vendor/fruitcake/laravel-cors/src/CorsServiceProvider.php b/vendor/fruitcake/laravel-cors/src/CorsServiceProvider.php
deleted file mode 100644
index 58948155b..000000000
--- a/vendor/fruitcake/laravel-cors/src/CorsServiceProvider.php
+++ /dev/null
@@ -1,115 +0,0 @@
-mergeConfigFrom($this->configPath(), 'cors');
-
- $this->app->singleton(CorsService::class, function ($app) {
- return new CorsService($this->corsOptions(), $app);
- });
- }
-
- /**
- * Register the config for publishing
- *
- */
- public function boot()
- {
- if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) {
- $this->publishes([$this->configPath() => config_path('cors.php')], 'cors');
- } elseif ($this->app instanceof LumenApplication) {
- $this->app->configure('cors');
- }
-
- // Add the headers on the Request Handled event as fallback in case of exceptions
- if (class_exists(RequestHandled::class) && $this->app->bound('events')) {
- $this->app->make('events')->listen(RequestHandled::class, function (RequestHandled $event) {
- $this->app->make(HandleCors::class)->onRequestHandled($event);
- });
- }
- }
-
- /**
- * Set the config path
- *
- * @return string
- */
- protected function configPath()
- {
- return __DIR__ . '/../config/cors.php';
- }
-
- /**
- * Get options for CorsService
- *
- * @return array
- */
- protected function corsOptions()
- {
- $config = $this->app['config']->get('cors');
-
- if ($config['exposed_headers'] && !is_array($config['exposed_headers'])) {
- throw new \RuntimeException('CORS config `exposed_headers` should be `false` or an array');
- }
-
- foreach (['allowed_origins', 'allowed_origins_patterns', 'allowed_headers', 'allowed_methods'] as $key) {
- if (!is_array($config[$key])) {
- throw new \RuntimeException('CORS config `' . $key . '` should be an array');
- }
- }
-
- // Convert case to supported options
- $options = [
- 'supportsCredentials' => $config['supports_credentials'],
- 'allowedOrigins' => $config['allowed_origins'],
- 'allowedOriginsPatterns' => $config['allowed_origins_patterns'],
- 'allowedHeaders' => $config['allowed_headers'],
- 'allowedMethods' => $config['allowed_methods'],
- 'exposedHeaders' => $config['exposed_headers'],
- 'maxAge' => $config['max_age'],
- ];
-
- // Transform wildcard pattern
- foreach ($options['allowedOrigins'] as $origin) {
- if (strpos($origin, '*') !== false) {
- $options['allowedOriginsPatterns'][] = $this->convertWildcardToPattern($origin);
- }
- }
-
- return $options;
- }
-
- /**
- * Create a pattern for a wildcard, based on Str::is() from Laravel
- *
- * @see https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Str.php
- * @param string $pattern
- * @return string
- */
- protected function convertWildcardToPattern($pattern)
- {
- $pattern = preg_quote($pattern, '#');
-
- // Asterisks are translated into zero-or-more regular expression wildcards
- // to make it convenient to check if the strings starts with the given
- // pattern such as "library/*", making any string check convenient.
- $pattern = str_replace('\*', '.*', $pattern);
-
- return '#^' . $pattern . '\z#u';
- }
-}
diff --git a/vendor/fruitcake/laravel-cors/src/HandleCors.php b/vendor/fruitcake/laravel-cors/src/HandleCors.php
deleted file mode 100644
index a876b3f3f..000000000
--- a/vendor/fruitcake/laravel-cors/src/HandleCors.php
+++ /dev/null
@@ -1,145 +0,0 @@
-cors = $cors;
- $this->container = $container;
- }
-
- /**
- * Handle an incoming request. Based on Asm89\Stack\Cors by asm89
- *
- * @param \Illuminate\Http\Request $request
- * @param \Closure $next
- * @return Response
- */
- public function handle($request, Closure $next)
- {
- // Check if we're dealing with CORS and if we should handle it
- if (! $this->shouldRun($request)) {
- return $next($request);
- }
-
- // For Preflight, return the Preflight response
- if ($this->cors->isPreflightRequest($request)) {
- $response = $this->cors->handlePreflightRequest($request);
-
- $this->cors->varyHeader($response, 'Access-Control-Request-Method');
-
- return $response;
- }
-
-
- // Handle the request
- $response = $next($request);
-
- if ($request->getMethod() === 'OPTIONS') {
- $this->cors->varyHeader($response, 'Access-Control-Request-Method');
- }
-
- return $this->addHeaders($request, $response);
- }
-
- /**
- * Add the headers to the Response, if they don't exist yet.
- *
- * @param Request $request
- * @param Response $response
- * @return Response
- */
- protected function addHeaders(Request $request, Response $response): Response
- {
- if (! $response->headers->has('Access-Control-Allow-Origin')) {
- // Add the CORS headers to the Response
- $response = $this->cors->addActualRequestHeaders($response, $request);
- }
-
- return $response;
- }
-
- /**
- * Add the headers to the Response, if they don't exist yet.
- *
- * @param RequestHandled $event
- * @deprecated
- */
- public function onRequestHandled(RequestHandled $event)
- {
- if ($this->shouldRun($event->request) && $this->container->make(Kernel::class)->hasMiddleware(static::class)) {
- $this->addHeaders($event->request, $event->response);
- }
- }
-
-
- /**
- * Determine if the request has a URI that should pass through the CORS flow.
- *
- * @param \Illuminate\Http\Request $request
- * @return bool
- */
- protected function shouldRun(Request $request): bool
- {
- return $this->isMatchingPath($request);
- }
-
- /**
- * The the path from the config, to see if the CORS Service should run
- *
- * @param \Illuminate\Http\Request $request
- * @return bool
- */
- protected function isMatchingPath(Request $request): bool
- {
- // Get the paths from the config or the middleware
- $paths = $this->getPathsByHost($request->getHost());
-
- foreach ($paths as $path) {
- if ($path !== '/') {
- $path = trim($path, '/');
- }
-
- if ($request->fullUrlIs($path) || $request->is($path)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Paths by given host or string values in config by default
- *
- * @param string $host
- * @return array
- */
- protected function getPathsByHost(string $host)
- {
- $paths = $this->container['config']->get('cors.paths', []);
- // If where are paths by given host
- if (isset($paths[$host])) {
- return $paths[$host];
- }
- // Defaults
- return array_filter($paths, function ($path) {
- return is_string($path);
- });
- }
-}
diff --git a/vendor/fruitcake/php-cors/LICENSE b/vendor/fruitcake/php-cors/LICENSE
new file mode 100644
index 000000000..1e4de414f
--- /dev/null
+++ b/vendor/fruitcake/php-cors/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2013-2017 Alexander
+Copyright (c) 2017-2022 Barryvdh
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/fruitcake/php-cors/README.md b/vendor/fruitcake/php-cors/README.md
new file mode 100644
index 000000000..6effc74f1
--- /dev/null
+++ b/vendor/fruitcake/php-cors/README.md
@@ -0,0 +1,78 @@
+# CORS for PHP (using the Symfony HttpFoundation)
+
+[](https://github.com/fruitcake/php-cors/actions)
+[](https://github.com/fruitcake/php-cors/actions)
+[](https://github.com/fruitcake/php-cors/actions/workflows/run-coverage.yml)
+[](http://choosealicense.com/licenses/mit/)
+[](https://packagist.org/packages/fruitcake/php-cors)
+[](https://packagist.org/packages/fruitcake/php-cors)
+[](https://fruitcake.nl/)
+
+Library and middleware enabling cross-origin resource sharing for your
+http-{foundation,kernel} using application. It attempts to implement the
+[W3C Recommendation] for cross-origin resource sharing.
+
+[W3C Recommendation]: http://www.w3.org/TR/cors/
+
+> Note: This is a standalone fork of https://github.com/asm89/stack-cors and is compatible with the options for CorsService.
+## Installation
+
+Require `fruitcake/php-cors` using composer.
+
+## Usage
+
+This package can be used as a library. You can use it in your framework using:
+
+ - [Stack middleware](http://stackphp.com/): https://github.com/asm89/stack-cors
+ - [Laravel](https://laravel.com): https://github.com/fruitcake/laravel-cors
+
+
+### Options
+
+| Option | Description | Default value |
+|------------------------|------------------------------------------------------------|---------------|
+| allowedMethods | Matches the request method. | `[]` |
+| allowedOrigins | Matches the request origin. | `[]` |
+| allowedOriginsPatterns | Matches the request origin with `preg_match`. | `[]` |
+| allowedHeaders | Sets the Access-Control-Allow-Headers response header. | `[]` |
+| exposedHeaders | Sets the Access-Control-Expose-Headers response header. | `[]` |
+| maxAge | Sets the Access-Control-Max-Age response header. | `0` |
+| supportsCredentials | Sets the Access-Control-Allow-Credentials header. | `false` |
+
+The _allowedMethods_ and _allowedHeaders_ options are case-insensitive.
+
+You don't need to provide both _allowedOrigins_ and _allowedOriginsPatterns_. If one of the strings passed matches, it is considered a valid origin. A wildcard in allowedOrigins will be converted to a pattern.
+
+If `['*']` is provided to _allowedMethods_, _allowedOrigins_ or _allowedHeaders_ all methods / origins / headers are allowed.
+
+> Note: Allowing a single static origin will improve cacheability.
+
+### Example: using the library
+
+```php
+ ['x-allowed-header', 'x-other-allowed-header'],
+ 'allowedMethods' => ['DELETE', 'GET', 'POST', 'PUT'],
+ 'allowedOrigins' => ['http://localhost', 'https://*.example.com'],
+ 'allowedOriginsPatterns' => ['/localhost:\d/'],
+ 'exposedHeaders' => ['Content-Encoding'],
+ 'maxAge' => false,
+ 'supportsCredentials' => false,
+]);
+
+$cors->addActualRequestHeaders(Response $response, $origin);
+$cors->handlePreflightRequest(Request $request);
+$cors->isActualRequestAllowed(Request $request);
+$cors->isCorsRequest(Request $request);
+$cors->isPreflightRequest(Request $request);
+```
+
+## License
+
+Released under the MIT License, see [LICENSE](LICENSE).
+
+> This package is split-off from https://github.com/asm89/stack-cors and developed as stand-alone library since 2022
diff --git a/vendor/fruitcake/php-cors/composer.json b/vendor/fruitcake/php-cors/composer.json
new file mode 100644
index 000000000..dc40cccb7
--- /dev/null
+++ b/vendor/fruitcake/php-cors/composer.json
@@ -0,0 +1,49 @@
+{
+ "name": "fruitcake/php-cors",
+ "description": "Cross-origin resource sharing library for the Symfony HttpFoundation",
+ "keywords": ["cors", "symfony", "laravel"],
+ "homepage": "https://github.com/fruitcake/php-cors",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
+ },
+ {
+ "name": "Barryvdh",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "require": {
+ "php": "^7.4|^8.0",
+ "symfony/http-foundation": "^4.4|^5.4|^6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9",
+ "squizlabs/php_codesniffer": "^3.5",
+ "phpstan/phpstan": "^1.4"
+ },
+ "autoload": {
+ "psr-4": {
+ "Fruitcake\\Cors\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Fruitcake\\Cors\\Tests\\": "tests/"
+ }
+ },
+ "scripts": {
+ "actions": "composer test && composer analyse && composer check-style",
+ "test": "phpunit",
+ "analyse": "phpstan analyse src tests --level=9",
+ "check-style": "phpcs -p --standard=PSR12 --exclude=Generic.Files.LineLength --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src tests",
+ "fix-style": "phpcbf -p --standard=PSR12 --exclude=Generic.Files.LineLength --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src tests"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.1-dev"
+ }
+ }
+}
diff --git a/vendor/fruitcake/php-cors/src/CorsService.php b/vendor/fruitcake/php-cors/src/CorsService.php
new file mode 100644
index 000000000..35a3f738c
--- /dev/null
+++ b/vendor/fruitcake/php-cors/src/CorsService.php
@@ -0,0 +1,285 @@
+
+ * (c) Barryvdh
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fruitcake\Cors;
+
+use Fruitcake\Cors\Exceptions\InvalidOptionException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * @phpstan-type CorsInputOptions array{
+ * 'allowedOrigins'?: string[],
+ * 'allowedOriginsPatterns'?: string[],
+ * 'supportsCredentials'?: bool,
+ * 'allowedHeaders'?: string[],
+ * 'allowedMethods'?: string[],
+ * 'exposedHeaders'?: string[]|false,
+ * 'maxAge'?: int|bool|null,
+ * 'allowed_origins'?: string[],
+ * 'allowed_origins_patterns'?: string[],
+ * 'supports_credentials'?: bool,
+ * 'allowed_headers'?: string[],
+ * 'allowed_methods'?: string[],
+ * 'exposed_headers'?: string[]|false,
+ * 'max_age'?: int|bool|null
+ * }
+ *
+ */
+class CorsService
+{
+ /** @var string[] */
+ private array $allowedOrigins = [];
+ /** @var string[] */
+ private array $allowedOriginsPatterns = [];
+ /** @var string[] */
+ private array $allowedMethods = [];
+ /** @var string[] */
+ private array $allowedHeaders = [];
+ /** @var string[] */
+ private array $exposedHeaders = [];
+ private bool $supportsCredentials = false;
+ private ?int $maxAge = 0;
+
+ private bool $allowAllOrigins = false;
+ private bool $allowAllMethods = false;
+ private bool $allowAllHeaders = false;
+
+ /**
+ * @param CorsInputOptions $options
+ */
+ public function __construct(array $options = [])
+ {
+ if ($options) {
+ $this->setOptions($options);
+ }
+ }
+
+ /**
+ * @param CorsInputOptions $options
+ */
+ public function setOptions(array $options): void
+ {
+ $this->allowedOrigins = $options['allowedOrigins'] ?? $options['allowed_origins'] ?? $this->allowedOrigins;
+ $this->allowedOriginsPatterns =
+ $options['allowedOriginsPatterns'] ?? $options['allowed_origins_patterns'] ?? $this->allowedOriginsPatterns;
+ $this->allowedMethods = $options['allowedMethods'] ?? $options['allowed_methods'] ?? $this->allowedMethods;
+ $this->allowedHeaders = $options['allowedHeaders'] ?? $options['allowed_headers'] ?? $this->allowedHeaders;
+ $this->supportsCredentials =
+ $options['supportsCredentials'] ?? $options['supports_credentials'] ?? $this->supportsCredentials;
+
+ $maxAge = $this->maxAge;
+ if (array_key_exists('maxAge', $options)) {
+ $maxAge = $options['maxAge'];
+ } elseif (array_key_exists('max_age', $options)) {
+ $maxAge = $options['max_age'];
+ }
+ $this->maxAge = $maxAge === null ? null : (int)$maxAge;
+
+ $exposedHeaders = $options['exposedHeaders'] ?? $options['exposed_headers'] ?? $this->exposedHeaders;
+ $this->exposedHeaders = $exposedHeaders === false ? [] : $exposedHeaders;
+
+ $this->normalizeOptions();
+ }
+
+ private function normalizeOptions(): void
+ {
+ // Normalize case
+ $this->allowedHeaders = array_map('strtolower', $this->allowedHeaders);
+ $this->allowedMethods = array_map('strtoupper', $this->allowedMethods);
+
+ // Normalize ['*'] to true
+ $this->allowAllOrigins = in_array('*', $this->allowedOrigins);
+ $this->allowAllHeaders = in_array('*', $this->allowedHeaders);
+ $this->allowAllMethods = in_array('*', $this->allowedMethods);
+
+ // Transform wildcard pattern
+ if (!$this->allowAllOrigins) {
+ foreach ($this->allowedOrigins as $origin) {
+ if (strpos($origin, '*') !== false) {
+ $this->allowedOriginsPatterns[] = $this->convertWildcardToPattern($origin);
+ }
+ }
+ }
+ }
+
+ /**
+ * Create a pattern for a wildcard, based on Str::is() from Laravel
+ *
+ * @see https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Str.php
+ * @param string $pattern
+ * @return string
+ */
+ private function convertWildcardToPattern($pattern)
+ {
+ $pattern = preg_quote($pattern, '#');
+
+ // Asterisks are translated into zero-or-more regular expression wildcards
+ // to make it convenient to check if the strings starts with the given
+ // pattern such as "*.example.com", making any string check convenient.
+ $pattern = str_replace('\*', '.*', $pattern);
+
+ return '#^' . $pattern . '\z#u';
+ }
+
+ public function isCorsRequest(Request $request): bool
+ {
+ return $request->headers->has('Origin');
+ }
+
+ public function isPreflightRequest(Request $request): bool
+ {
+ return $request->getMethod() === 'OPTIONS' && $request->headers->has('Access-Control-Request-Method');
+ }
+
+ public function handlePreflightRequest(Request $request): Response
+ {
+ $response = new Response();
+
+ $response->setStatusCode(204);
+
+ return $this->addPreflightRequestHeaders($response, $request);
+ }
+
+ public function addPreflightRequestHeaders(Response $response, Request $request): Response
+ {
+ $this->configureAllowedOrigin($response, $request);
+
+ if ($response->headers->has('Access-Control-Allow-Origin')) {
+ $this->configureAllowCredentials($response, $request);
+
+ $this->configureAllowedMethods($response, $request);
+
+ $this->configureAllowedHeaders($response, $request);
+
+ $this->configureMaxAge($response, $request);
+ }
+
+ return $response;
+ }
+
+ public function isOriginAllowed(Request $request): bool
+ {
+ if ($this->allowAllOrigins === true) {
+ return true;
+ }
+
+ $origin = (string) $request->headers->get('Origin');
+
+ if (in_array($origin, $this->allowedOrigins)) {
+ return true;
+ }
+
+ foreach ($this->allowedOriginsPatterns as $pattern) {
+ if (preg_match($pattern, $origin)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function addActualRequestHeaders(Response $response, Request $request): Response
+ {
+ $this->configureAllowedOrigin($response, $request);
+
+ if ($response->headers->has('Access-Control-Allow-Origin')) {
+ $this->configureAllowCredentials($response, $request);
+
+ $this->configureExposedHeaders($response, $request);
+ }
+
+ return $response;
+ }
+
+ private function configureAllowedOrigin(Response $response, Request $request): void
+ {
+ if ($this->allowAllOrigins === true && !$this->supportsCredentials) {
+ // Safe+cacheable, allow everything
+ $response->headers->set('Access-Control-Allow-Origin', '*');
+ } elseif ($this->isSingleOriginAllowed()) {
+ // Single origins can be safely set
+ $response->headers->set('Access-Control-Allow-Origin', array_values($this->allowedOrigins)[0]);
+ } else {
+ // For dynamic headers, set the requested Origin header when set and allowed
+ if ($this->isCorsRequest($request) && $this->isOriginAllowed($request)) {
+ $response->headers->set('Access-Control-Allow-Origin', (string) $request->headers->get('Origin'));
+ }
+
+ $this->varyHeader($response, 'Origin');
+ }
+ }
+
+ private function isSingleOriginAllowed(): bool
+ {
+ if ($this->allowAllOrigins === true || count($this->allowedOriginsPatterns) > 0) {
+ return false;
+ }
+
+ return count($this->allowedOrigins) === 1;
+ }
+
+ private function configureAllowedMethods(Response $response, Request $request): void
+ {
+ if ($this->allowAllMethods === true) {
+ $allowMethods = strtoupper((string) $request->headers->get('Access-Control-Request-Method'));
+ $this->varyHeader($response, 'Access-Control-Request-Method');
+ } else {
+ $allowMethods = implode(', ', $this->allowedMethods);
+ }
+
+ $response->headers->set('Access-Control-Allow-Methods', $allowMethods);
+ }
+
+ private function configureAllowedHeaders(Response $response, Request $request): void
+ {
+ if ($this->allowAllHeaders === true) {
+ $allowHeaders = (string) $request->headers->get('Access-Control-Request-Headers');
+ $this->varyHeader($response, 'Access-Control-Request-Headers');
+ } else {
+ $allowHeaders = implode(', ', $this->allowedHeaders);
+ }
+ $response->headers->set('Access-Control-Allow-Headers', $allowHeaders);
+ }
+
+ private function configureAllowCredentials(Response $response, Request $request): void
+ {
+ if ($this->supportsCredentials) {
+ $response->headers->set('Access-Control-Allow-Credentials', 'true');
+ }
+ }
+
+ private function configureExposedHeaders(Response $response, Request $request): void
+ {
+ if ($this->exposedHeaders) {
+ $response->headers->set('Access-Control-Expose-Headers', implode(', ', $this->exposedHeaders));
+ }
+ }
+
+ private function configureMaxAge(Response $response, Request $request): void
+ {
+ if ($this->maxAge !== null) {
+ $response->headers->set('Access-Control-Max-Age', (string) $this->maxAge);
+ }
+ }
+
+ public function varyHeader(Response $response, string $header): Response
+ {
+ if (!$response->headers->has('Vary')) {
+ $response->headers->set('Vary', $header);
+ } elseif (!in_array($header, explode(', ', (string) $response->headers->get('Vary')))) {
+ $response->headers->set('Vary', ((string) $response->headers->get('Vary')) . ', ' . $header);
+ }
+
+ return $response;
+ }
+}
diff --git a/vendor/fruitcake/php-cors/src/Exceptions/InvalidOptionException.php b/vendor/fruitcake/php-cors/src/Exceptions/InvalidOptionException.php
new file mode 100644
index 000000000..eba6f4666
--- /dev/null
+++ b/vendor/fruitcake/php-cors/src/Exceptions/InvalidOptionException.php
@@ -0,0 +1,16 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fruitcake\Cors\Exceptions;
+
+class InvalidOptionException extends \RuntimeException
+{
+}
diff --git a/vendor/gitonomy/gitlib/.gitattributes b/vendor/gitonomy/gitlib/.gitattributes
deleted file mode 100644
index 176a458f9..000000000
--- a/vendor/gitonomy/gitlib/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text=auto
diff --git a/vendor/gitonomy/gitlib/.github/CODE_OF_CONDUCT.md b/vendor/gitonomy/gitlib/.github/CODE_OF_CONDUCT.md
deleted file mode 100644
index 590c95931..000000000
--- a/vendor/gitonomy/gitlib/.github/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# CONTRIBUTOR COVENANT CODE OF CONDUCT
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, caste, color, religion, or sexual identity
-and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the
- overall community
-
-Examples of unacceptable behavior include:
-
-* The use of sexualized language or imagery, and sexual attention or
- advances of any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email
- address, without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at
-hello@gjcampbell.co.uk.
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series
-of actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or
-permanent ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within
-the community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.1, available at
-[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
-
-Community Impact Guidelines were inspired by
-[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
-
-For answers to common questions about this code of conduct, see the FAQ at
-[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
-at [https://www.contributor-covenant.org/translations][translations].
-
-[homepage]: https://www.contributor-covenant.org
-[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
-[Mozilla CoC]: https://github.com/mozilla/diversity
-[FAQ]: https://www.contributor-covenant.org/faq
-[translations]: https://www.contributor-covenant.org/translations
diff --git a/vendor/gitonomy/gitlib/.github/CONTRIBUTING.md b/vendor/gitonomy/gitlib/.github/CONTRIBUTING.md
deleted file mode 100644
index d33db7e86..000000000
--- a/vendor/gitonomy/gitlib/.github/CONTRIBUTING.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# CONTRIBUTION GUIDELINES
-
-Contributions are **welcome** and will be fully **credited**.
-
-We accept contributions via pull requests on GitHub. Please review these guidelines before continuing.
-
-## Guidelines
-
-* Please follow the [PSR-12 Coding Style Guide](https://www.php-fig.org/psr/psr-12/), enforced by [StyleCI](https://styleci.io/).
-* Ensure that the current tests pass, and if you've added something new, add the tests where relevant.
-* Send a coherent commit history, making sure each commit in your pull request is meaningful.
-* You may need to [rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) to avoid merge conflicts.
-* If you are changing or adding to the behaviour or public API, you may need to update the docs.
-* Please remember that we follow [Semantic Versioning](https://semver.org/).
-
-## Running Tests
-
-First, install the dependencies using [Composer](https://getcomposer.org/):
-
-```bash
-$ composer install
-```
-
-Then run [PHPUnit](https://phpunit.de/):
-
-```bash
-$ vendor/bin/phpunit
-```
-
-* A script `test-git-version.sh` is available in repository to test gitlib against many git versions.
-* The tests will be automatically run by [GitHub Actions](https://github.com/features/actions) against pull requests.
-* We also have [StyleCI](https://styleci.io/) set up to automatically fix any code style issues.
diff --git a/vendor/gitonomy/gitlib/.github/FUNDING.yml b/vendor/gitonomy/gitlib/.github/FUNDING.yml
deleted file mode 100644
index 856fb0268..000000000
--- a/vendor/gitonomy/gitlib/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-tidelift: "packagist/gitonomy/gitlib"
diff --git a/vendor/gitonomy/gitlib/.github/SECURITY.md b/vendor/gitonomy/gitlib/.github/SECURITY.md
deleted file mode 100644
index 0c3e8a242..000000000
--- a/vendor/gitonomy/gitlib/.github/SECURITY.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# SECURITY POLICY
-
-## Supported Versions
-
-After each new major release, the previous release will be supported for no
-less than 12 months, unless explictly stated otherwise. This may mean that
-there are multiple supported versions at any given time.
-
-## Reporting a Vulnerability
-
-If you discover a security vulnerability within this package, please send an
-email to security@tidelift.com. All security vulnerabilities will be promptly
-addressed. Please do not disclose security-related issues publicly until a fix
-has been announced.
diff --git a/vendor/gitonomy/gitlib/.github/workflows/tests.yml b/vendor/gitonomy/gitlib/.github/workflows/tests.yml
deleted file mode 100644
index 34cc6607f..000000000
--- a/vendor/gitonomy/gitlib/.github/workflows/tests.yml
+++ /dev/null
@@ -1,96 +0,0 @@
-name: Tests
-
-on:
- push:
- pull_request:
-
-jobs:
- tests:
- name: PHP ${{ matrix.php }}; Symfony ${{ matrix.symfony }}
- runs-on: ubuntu-20.04
-
- strategy:
- matrix:
- php: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
- symfony: ['3', '4', '5', '6']
- exclude:
- - php: '5.6'
- symfony: '4'
- - php: '5.6'
- symfony: '5'
- - php: '5.6'
- symfony: '6'
- - php: '7.0'
- symfony: '4'
- - php: '7.0'
- symfony: '5'
- - php: '7.0'
- symfony: '6'
- - php: '7.1'
- symfony: '5'
- - php: '7.1'
- symfony: '6'
- - php: '7.2'
- symfony: '6'
- - php: '7.3'
- symfony: '6'
- - php: '7.4'
- symfony: '6'
- - php: '8.1'
- symfony: '3'
-
- steps:
- - name: Checkout Code
- uses: actions/checkout@v2
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: ${{ matrix.php }}
- tools: composer:v2
- coverage: none
-
- - name: Setup Problem Matchers
- run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
-
- - name: Select Symfony 3
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer require "symfony/process:^3.4" --no-update --no-interaction
- if: "matrix.symfony == '3'"
-
- - name: Select Symfony 4
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer require "symfony/process:^4.4" --no-update --no-interaction
- if: "matrix.symfony == '4'"
-
- - name: Select Symfony 5
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer require "symfony/process:^5.3" --no-update --no-interaction
- if: "matrix.symfony == '5'"
-
- - name: Select Symfony 6
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer require "symfony/process:^6.0" --no-update --no-interaction
- if: "matrix.symfony == '6'"
-
- - name: Install PHP Dependencies
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer update --no-interaction --no-progress
-
- - name: Execute PHPUnit
- run: vendor/bin/phpunit
diff --git a/vendor/gitonomy/gitlib/.gitignore b/vendor/gitonomy/gitlib/.gitignore
deleted file mode 100644
index 376a2cd1d..000000000
--- a/vendor/gitonomy/gitlib/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/.phpunit.result.cache
-/composer.lock
-/phpunit.xml
-/vendor
diff --git a/vendor/gitonomy/gitlib/LICENSE b/vendor/gitonomy/gitlib/LICENSE
deleted file mode 100644
index 1797eac69..000000000
--- a/vendor/gitonomy/gitlib/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2012 Alexandre Salomé
-Copyright (c) 2012 Julien DIDIER
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/gitonomy/gitlib/README.md b/vendor/gitonomy/gitlib/README.md
deleted file mode 100644
index 333cc6d25..000000000
--- a/vendor/gitonomy/gitlib/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-Gitlib for Gitonomy
-===================
-
-[](https://github.com/gitonomy/gitlib/actions?query=workflow%3ATests+branch%3A1.3)
-[](https://github.styleci.io/repos/5709354?branch=1.3)
-[](https://opensource.org/licenses/MIT)
-[](https://packagist.org/packages/gitonomy/gitlib)
-
-This library provides methods to access Git repository from PHP 5.6+.
-
-It makes shell calls, which makes it less performant than any solution.
-
-Anyway, it's convenient and don't need to build anything to use it. That's how we love it.
-
-Quick Start
------------
-
-You can install gitlib using [Composer](https://getcomposer.org/). Simply require the version you need:
-
-```bash
-$ composer require gitonomy/gitlib
-```
-
-or edit your `composer.json` file by hand:
-
-```json
-{
- "require": {
- "gitonomy/gitlib": "^1.3"
- }
-}
-```
-
-Example Usage
--------------
-
-```php
-getReferences()->getBranches() as $branch) {
- echo '- '.$branch->getName().PHP_EOL;
-}
-
-$repository->run('fetch', ['--all']);
-```
-
-API Documentation
------------------
-
-+ [Admin](doc/admin.md)
-+ [Blame](doc/blame.md)
-+ [Blob](doc/blob.md)
-+ [Branch](doc/branch.md)
-+ [Commit](doc/commit.md)
-+ [Diff](doc/diff.md)
-+ [Hooks](doc/hooks.md)
-+ [Log](doc/log.md)
-+ [References](doc/references.md)
-+ [Repository](doc/repository.md)
-+ [Revision](doc/revision.md)
-+ [Tree](doc/tree.md)
-+ [Working Copy](doc/workingcopy.md)
-
-For Enterprise
---------------
-
-Available as part of the Tidelift Subscription
-
-The maintainers of `gitonomy/gitlib` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-gitonomy-gitlib?utm_source=packagist-gitonomy-gitlib&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/vendor/gitonomy/gitlib/composer.json b/vendor/gitonomy/gitlib/composer.json
deleted file mode 100644
index 86735c148..000000000
--- a/vendor/gitonomy/gitlib/composer.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "name": "gitonomy/gitlib",
- "description": "Library for accessing git",
- "license": "MIT",
- "authors": [
- {
- "name": "Graham Campbell",
- "email": "hello@gjcampbell.co.uk",
- "homepage": "https://github.com/GrahamCampbell"
- },
- {
- "name": "Julien Didier",
- "email": "genzo.wm@gmail.com",
- "homepage": "https://github.com/juliendidier"
- },
- {
- "name": "Grégoire Pineau",
- "email": "lyrixx@lyrixx.info",
- "homepage": "https://github.com/lyrixx"
- },
- {
- "name": "Alexandre Salomé",
- "email": "alexandre.salome@gmail.com",
- "homepage": "https://github.com/alexandresalome"
- }
- ],
- "autoload": {
- "psr-4": {
- "Gitonomy\\Git\\": "src/Gitonomy/Git/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "Gitonomy\\Git\\Tests\\": "tests/Gitonomy/Git/Tests/"
- }
- },
- "require": {
- "php": "^5.6 || ^7.0 || ^8.0",
- "ext-pcre": "*",
- "symfony/polyfill-mbstring": "^1.7",
- "symfony/process": "^3.4 || ^4.4 || ^5.0 || ^6.0"
- },
- "require-dev": {
- "ext-fileinfo": "*",
- "phpspec/prophecy": "^1.10.2",
- "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9",
- "psr/log": "^1.0"
- },
- "suggest": {
- "ext-fileinfo": "Required to determine the mimetype of a blob",
- "psr/log": "Required to use loggers for reporting of execution"
- },
- "config": {
- "preferred-install": "dist"
- },
- "minimum-stability": "dev",
- "prefer-stable": true
-}
diff --git a/vendor/gitonomy/gitlib/doc/admin.md b/vendor/gitonomy/gitlib/doc/admin.md
deleted file mode 100644
index d4776804b..000000000
--- a/vendor/gitonomy/gitlib/doc/admin.md
+++ /dev/null
@@ -1,77 +0,0 @@
-Create and access git repositories
-==================================
-
-gitlib provides methods to initialize new repositories.
-
-Create a repository
--------------------
-
-To initialize a new repository, use method `Admin::init`.
-
-```php
-// Initialize a bare repository
-$repository = Gitonomy\Git\Admin::init('/path/to/repository');
-
-// Initialize a non-bare repository
-$repository = Gitonomy\Git\Admin::init('/path/to/repository', false);
-```
-
-Default behavior is to create a bare repository. If you want to
-initialize a repository with a working copy,pass `false` as third
-argument of Repository constructor.
-
-Cloning repositories
---------------------
-
-You can clone a repository from an URL by doing:
-
-```php
-// Clone to a bare repository
-$repository = Gitonomy\Git\Admin::cloneTo('/tmp/gitlib', 'https://github.com/gitonomy/gitlib.git');
-
-// Clone to a non-bare repository
-$repository = Gitonomy\Git\Admin::cloneTo('/tmp/gitlib', 'https://github.com/gitonomy/gitlib.git', false);
-```
-
-Default behavior is to clone in a bare repository.
-
-You can also clone a repository and point it to a specific branch. In a
-non-bare repository, this branch will be checked out:
-
-```php
-// Clone to a bare repository
-$repository = Gitonomy\Git\Admin::cloneBranchTo('/tmp/gitlib', 'https://github.com/gitonomy/gitlib.git', 'a-branch');
-
-// Clone to a non-bare repository
-$repository = Gitonomy\Git\Admin::cloneBranchTo('/tmp/gitlib', 'https://github.com/gitonomy/gitlib.git', 'a-branch', false);
-```
-
-Clone a Repository object
--------------------------
-
-If you already have a Repository instance and want to clone it, you can
-use this shortcut:
-
-```php
-$new = $repository->cloneTo('/tmp/clone');
-```
-
-Mirror a repository
--------------------
-
-If you want to mirror fully a repository and all references, use the
-`mirrorTo` method. This method takes only two arguments, where to mirror
-and what to mirror:
-
-```php
-// Mirror to a bare repository
-$mirror = Gitonomy\Git\Admin::mirrorTo('/tmp/mirror', 'https://github.com/gitonomy/gitlib.git');
-
-// Mirror to a non-bare repository
-$mirror = Gitonomy\Git\Admin::mirrorTo('/tmp/mirror', 'https://github.com/gitonomy/gitlib.git', false);
-```
-
-### References
-
--
--
diff --git a/vendor/gitonomy/gitlib/doc/blame.md b/vendor/gitonomy/gitlib/doc/blame.md
deleted file mode 100644
index 80816c9b0..000000000
--- a/vendor/gitonomy/gitlib/doc/blame.md
+++ /dev/null
@@ -1,58 +0,0 @@
-Blaming files
-=============
-
-Line-per-line iteration
------------------------
-
-To iterate on lines of a blame:
-
-```php
-$blame = $repository->getBlame('master', 'README.md');
-
-foreach ($blame->getLines() as $lineNumber => $line) {
- $commit = $line->getCommit();
- echo $lineNumber.': '.$line->getContent().' - '.$commit->getAuthorName().PHP_EOL;
-}
-```
-
-The *getLines* method returns an array indexed starting from 1.
-
-As you can see, you can access the commit object related to the line you
-are iterating on.
-
-If you want to access directly a line:
-
-```php
-$line = $blame->getLine(32);
-```
-
-The Line object
----------------
-
-LineObject represents an item of the blame file. It is composed of those
-informations:
-
-```php
-$line->getCommit(); // returns a Commit
-$line->getContent(); // returns text
-
-// you can access author from commmit:
-$author = $line->getCommit()->getAuthorName();
-```
-
-Group reading by commit
------------------------
-
-If you plan to display it, you'll probably need a version where lines
-from same commit are grouped.
-
-To do so, use the *getGroupedLines* method that will return an array
-like this:
-
-```php
-$blame = array(
- array(Commit, array(1 => Line, 2 => Line, 3 => Line)),
- array(Commit, array(4 => Line)),
- array(Commit, array(5 => Line, 6 => Line))
-)
-```
diff --git a/vendor/gitonomy/gitlib/doc/blob.md b/vendor/gitonomy/gitlib/doc/blob.md
deleted file mode 100644
index 2ed3bd41e..000000000
--- a/vendor/gitonomy/gitlib/doc/blob.md
+++ /dev/null
@@ -1,44 +0,0 @@
-Blob
-====
-
-In git, a blob represents a file content. You can't access the file name
-directly from the *Blob* object; the filename information is stored
-within the tree, not in the blob.
-
-It means that for git, two files with different names but same content
-will have the same hash.
-
-To access a repository *Blob*, you need the hash identifier:
-
-```php
-$repository = new Gitonomy\Git\Repository('/path/to/repository');
-$blob = $repository->getBlob('a7c8d2b4');
-```
-
-Get content
------------
-
-To get content from a *Blob* object:
-
-```php
-echo $blob->getContent();
-```
-
-File informations
------------------
-
-To get mimetype of a *Blob* object using finfo extension:
-
-```php
-echo $blob->getMimetype();
-```
-
-You can also test if *Blob* is a text of a binary file:
-
-```php
-if ($blob->isText()) {
- echo $blob->getContent(), PHP_EOL;
-} elseif ($blob->isBinary()) {
- echo 'File is binary', PHP_EOL;
-}
-```
diff --git a/vendor/gitonomy/gitlib/doc/branch.md b/vendor/gitonomy/gitlib/doc/branch.md
deleted file mode 100644
index d6e0872cd..000000000
--- a/vendor/gitonomy/gitlib/doc/branch.md
+++ /dev/null
@@ -1,16 +0,0 @@
-Branch
-======
-
-To access a *Branch*, starting from a repository object:
-
-```php
-$repository = new Gitonomy\Git\Repository('/path/to/repository');
-$branch = $repository->getReferences()->getBranch('master');
-```
-
-You can check is the branch is a local or remote one:
-
-```php
-$branch->isLocal();
-$branch->isRemote();
-```
diff --git a/vendor/gitonomy/gitlib/doc/commit.md b/vendor/gitonomy/gitlib/doc/commit.md
deleted file mode 100644
index 08e9b1e34..000000000
--- a/vendor/gitonomy/gitlib/doc/commit.md
+++ /dev/null
@@ -1,171 +0,0 @@
-Commit
-======
-
-To access a *Commit*, starting from a repository object:
-
-```php
-$repository = new Gitonomy\Git\Repository('/path/to/repository');
-$commit = $repository->getCommit('a7c8d2b4');
-```
-
-Browsing parents
-----------------
-
-A *Commit* can have a natural number of parents:
-
-- **no parent**: it's an initial commit, the root of a tree
-- **one parent**: it means it's not a merge, just a regular commit
-- **many parents**: it's a merge-commit
-
-You have 2 methods available for accessing parents:
-
-```php
-// Access parent hashes
-$hashes = $commit->getParentHashes();
-
-// Access parent commit objects
-$commits = $commit->getParents();
-```
-
-For example, if you want to display all parents, starting from a commit:
-
-```php
-function displayLog(Gitonomy\Git\Commit $commit) {
- echo '- '.$commit->getShortMessage().PHP_EOL;
- foreach ($commit->getParents() as $parent) {
- displayLog($parent);
- }
-}
-```
-
-Notice that this function will first display all commits from first
-merged branch and then display all commits from next branch, and so on.
-
-Accessing tree
---------------
-
-The tree object contains the reference to the files associated to a
-given commit. Every commit has one and only one tree, referencing all
-files and folders of a given state for a project. For more informations
-about the tree, see the chapter dedicated to it.
-
-To access a tree starting from a commit:
-
-```php
-// Returns the tree hash
-$tree = $commit->getTreeHash();
-
-// Returns the tree object
-$tree = $commit->getTree();
-```
-
-Author & Committer informations
--------------------------------
-
-Each commit has two authoring informations: an author and a committer.
-The author is the creator of the modification, authoring a modification
-in the repository. The committer is responsible of introducing this
-modification to the repository.
-
-You can access informations from author and committer using those
-methods:
-
-```php
-// Author
-$commit->getAuthorName();
-$commit->getAuthorEmail();
-$commit->getAuthorDate(); // returns a DateTime object
-
-// Committer
-$commit->getCommitterName();
-$commit->getCommitterEmail();
-$commit->getCommitterDate(); // returns a DateTime object
-```
-
-Commit message and short message
---------------------------------
-
-Each commit also has a message, associated to the modification. This
-message can be multilined.
-
-To access the message, you can use the *getMessage* method:
-
-```php
-$commit->getMessage();
-```
-
-For your convenience, this library provides a shortcut method to keep
-only the first line or first 50 characters if the first line is too
-long:
-
-```php
-$commit->getShortMessage();
-```
-
-You can customize it like this:
-
-```php
-$commit->getShortMessage(45, true, '.');
-```
-
-- The first parameter is the max length of the message.
-- The second parameter determine if the last word should be cut or
- preserved
-- The third parameter is the separator
-
-There are also two other methods for your convenience:
-
-```php
-// The first line
-$commit->getSubjectMessage();
-
-// The body (rest of the message)
-$commit->getBodyMessage();
-```
-
-Diff of a commit
-----------------
-
-You can check the modifications introduced by a commit using the
-*getDiff* method. When you request a diff for a commit, depending of the
-number of parents, the strategy will be different:
-
-- If you have *no parent*, the diff will be the content of the tree
-- If you only have *one parent*, the diff will be between the commit
- and his parent
-- If you have *multiple parents*, the diff will be the difference
- between the commit and the first common ancestor of all parents
-
-For more informations about the diff API, read the related chapter.
-
-To access the *Diff* object of a commit, use the method *getDiff*:
-
-```php
-$diff = $commit->getDiff();
-```
-
-Last modification of a file
----------------------------
-
-To know the last modification of a file, you can use the
-*getLastModification* method on a commit.
-
-Here is a very straightforward example:
-
-```php
-$last = $commit->getLastModification('README');
-
-echo 'Last README modification'.PHP_EOL;
-echo ' Author: '.$last->getAuthorName().PHP_EOL;
-echo ' Date: '.$last->getAuthorDate()->format('d/m/Y').PHP_EOL;
-echo ' Message: '.$last->getMessage();
-```
-
-Find every branches containing a commit
----------------------------------------
-
-```php
-$branches = $commit->getIncludingBranches($includeLocalBranches, $includeRemoteBranches);
-$localBranches = $commit->getIncludingBranches(true, false);
-$remoteBranches = $commit->getIncludingBranches(false, true);
-```
diff --git a/vendor/gitonomy/gitlib/doc/diff.md b/vendor/gitonomy/gitlib/doc/diff.md
deleted file mode 100644
index 2ce7870a9..000000000
--- a/vendor/gitonomy/gitlib/doc/diff.md
+++ /dev/null
@@ -1,104 +0,0 @@
-Computing diff
-==============
-
-Even if git is a diff-less storage engine, it's possible to compute
-them.
-
-To compute a diff in git, you need to specify a *revision*. This
-revision can be a commit (*2bc7a8*) or a range (*2bc7a8..ff4c21b*).
-
-For more informations about git revisions: *man gitrevisions*.
-
-When you have decided the revision you want and have your *Repository*
-object, you can call the *getDiff* method on the repository:
-
-```php
-$diff = $repository->getDiff('master@{2 days ago}..master');
-```
-
-You can also access it from a *Log* object:
-
-```php
-$log = $repository->getLog('master@{2 days ago}..master');
-$diff = $log->getDiff();
-```
-
-Iterating a diff
-----------------
-
-When you have a *Diff* object, you can iterate over files using method
-*getFiles()*. This method returns a list of *File* objects, who
-represents the modifications for a single file.
-
-```php
-$files = $diff->getFiles();
-echo sprintf('%s files modified%s', count($files), PHP_EOL);
-
-foreach ($files as $fileDiff) {
- echo sprintf('Old name: (%s) %s%s', $fileDiff->getOldMode(), $fileDiff->getOldName(), PHP_EOL);
- echo sprintf('New name: (%s) %s%s', $fileDiff->getNewMode(), $fileDiff->getNewName(), PHP_EOL);
-}
-```
-
-The File object
----------------
-
-Here is an exhaustive list of the *File* class methods:
-
-```php
-$file->getOldName();
-$file->getNewName();
-$file->getOldDiff();
-$file->getNewDiff();
-
-$file->isCreation();
-$file->isDeletion();
-$file->isModification();
-
-$file->isRename();
-$file->isChangeMode();
-
-$file->getAdditions(); // Number of added lines
-$file->getDeletions(); // Number of deleted lines
-
-$file->isBinary(); // Binary files have no "lines"
-
-$file->getChanges(); // See next chapter
-```
-
-The FileChange object
----------------------
-
-> **note**
->
-> This part of API is not very clean, very consistent. If you have any
-> idea or suggestion on how to enhance this, your comment would be
-> appreciated.
-
-A *File* object is composed of many changes. For each of those changes,
-a *FileChange* object is associated.
-
-To access changes from a file, use the *getChanges* method:
-
-```php
-$changes = $file->getChanges();
-foreach ($changes as $change) {
- foreach ($lines as $data) {
- list ($type, $line) = $data;
- if ($type === FileChange::LINE_CONTEXT) {
- echo ' '.$line.PHP_EOL;
- } elseif ($type === FileChange::LINE_ADD) {
- echo '+'.$line.PHP_EOL;
- } else {
- echo '-'.$line.PHP_EOL;
- }
- }
-}
-```
-
-To get line numbers, use the range methods:
-
-```php
-echo sprintf('Previously from line %s to %s%s', $change->getOldRangeStart(), $change->getOldRangeEnd(), PHP_EOL);
-echo sprintf('Now from line %s to %s%s', $change->getNewRangeStart(), $change->getNewRangeEnd(), PHP_EOL);
-```
diff --git a/vendor/gitonomy/gitlib/doc/hooks.md b/vendor/gitonomy/gitlib/doc/hooks.md
deleted file mode 100644
index eb5c8ab4b..000000000
--- a/vendor/gitonomy/gitlib/doc/hooks.md
+++ /dev/null
@@ -1,80 +0,0 @@
-Hooks
-=====
-
-It's possible to define custom hooks on any repository with git. Those
-hooks are located in the *.git/hooks* folder.
-
-Those files need to be executable. For convenience, gitlib will set them
-to *777*.
-
-With *gitlib*, you can manage hooks over a repository using the *Hooks*
-object.
-
-To access it from a repository, use the *getHooks* method on a
-*Repository* object:
-
-```php
-$hooks = $repository->getHooks();
-```
-
-Reading hooks
--------------
-
-To read the content of a hook, use the *get* method like this:
-
-```php
-$content = $hooks->get('pre-receive'); // returns a string
-```
-
-If the hook does not exist, an exception will be thrown
-(*InvalidArgumentException*).
-
-You can test if a hook is present using the method *has*:
-
-```php
-$hooks->has('pre-receive'); // a boolean indicating presence
-```
-
-Inserting hooks
----------------
-
-You can modify a hook in two different ways: creating a new file or
-using a symlink.
-
-To create the hook using a symlink:
-
-```php
-$hooks->setSymlink('pre-receive', '/path/to/file-to-link');
-```
-
-If the hook already exist, a *LogicException* will be thrown. If an
-error occured during symlink creation, a *RuntimeException* will be
-thrown.
-
-If you want to directly create a new file in hooks directory, use the
-method *set*. This method will create a new file, put content in it and
-make it executable:
-
-```php
-$content = <<set('pre-receive', $content);
-```
-
-If the hook already exists, a *LogicException* will be thrown.
-
-Removing hooks
---------------
-
-To remove a hook from a repository, use the function *remove*:
-
-```php
-$hooks->remove('pre-receive');
-```
diff --git a/vendor/gitonomy/gitlib/doc/log.md b/vendor/gitonomy/gitlib/doc/log.md
deleted file mode 100644
index 4dc5a465a..000000000
--- a/vendor/gitonomy/gitlib/doc/log.md
+++ /dev/null
@@ -1,55 +0,0 @@
-Getting log history
-===================
-
-Crawling manually commits and parents to browse history is surely a good
-solution. But when it comes to ordering them or aggregate them from
-multiple branches, we tend to use `git log`.
-
-To get a *Log* object from a repository:
-
-```php
-$log = $repository->getLog();
-```
-
-You can pass four arguments to *getLog* method:
-
-```php
-// Global log for repository
-$log = $repository->getLog();
-
-// Log for master branch
-$log = $repository->getLog('master');
-
-// Returns last 10 commits on README file
-$log = $repository->getLog('master', 'README', 0, 10);
-
-// Returns last 10 commits on README or UPGRADE files
-$log = $repository->getLog('master', ['README', 'UPGRADE'], 0, 10);
-```
-
-Counting
---------
-
-If you want to count overall commits, without offset or limit, use the
-*countCommits* method:
-
-```php
-echo sprintf('This log contains %s commits%s', $log->countCommits(), PHP_EOL);
-
-// Countable interface
-echo sprintf('This log contains %s commits%s', count($log), PHP_EOL);
-```
-
-Offset and limit
-----------------
-
-Use those methods:
-
-```php
-$log->setOffset(32);
-$log->setLimit(40);
-
-// or read it:
-$log->getOffset();
-$log->getLimit();
-```
diff --git a/vendor/gitonomy/gitlib/doc/references.md b/vendor/gitonomy/gitlib/doc/references.md
deleted file mode 100644
index 644309291..000000000
--- a/vendor/gitonomy/gitlib/doc/references.md
+++ /dev/null
@@ -1,92 +0,0 @@
-Tags and branches
-=================
-
-Accessing tags and branches
----------------------------
-
-With *gitlib*, you can access them via the *ReferenceBag* object. To get
-this object from a *Repository*, use the *getReferences* method:
-
-```php
-$references = $repository->getReferences();
-```
-
-First, you can test existence of tags and branches like this:
-
-```php
-if ($references->hasBranch('master') && $references->hasTag('0.1')) {
- echo 'Good start!'.PHP_EOL;
-}
-```
-
-If you want to access all branches or all tags:
-
-```php
-$branches = $references->getBranches();
-$localBranches = $references->getLocalBranches();
-$remoteBranches = $references->getRemoteBranches();
-$tags = $references->getTags();
-$all = $references->getAll();
-```
-
-To get a given branch or tag, call *getBranch* or *getTag* on the
-*ReferenceBag*. Those methods return *Branch* and *Tag* objects:
-
-```php
-$master = $references->getBranch('master');
-$feat123 = $references->getLocalBranch('feat123');
-$feat456 = $references->getRemoteBranch('origin/feat456');
-$v0_1 = $references->getTag('0.1');
-```
-
-If the reference cannot be resolved, a *ReferenceNotFoundException* will
-be thrown.
-
-On each of those objects, you can access those informations:
-
-```php
-// Get the associated commit
-$commit = $master->getCommit();
-
-// Get the commit hash
-$hash = $master->getCommitHash();
-
-// Get the last modification
-$lastModification = $master->getLastModification();
-```
-
-Create and delete reference
----------------------------
-
-You can create new tags and branches on repository, using helper methods
-on ReferenceBag object:
-
-```php
-// create a branch
-$references = $repository->getReferences();
-$branch = $references->createBranch('foobar', 'a8b7e4...'); // commit to reference
-
-// create a tag
-$references = $repository->getReferences();
-$tag = $references->createTag('0.3', 'a8b7e4...'); // commit to reference
-
-// delete a branch or a tag
-$branch->delete();
-```
-
-Resolution from a commit
-------------------------
-
-To resolve a branch or a commit from a commit, you can use the
-*resolveTags* and *resolveBranches* methods on it:
-
-```php
-$branches = $references->resolveBranches($commit);
-$tags = $references->resolveTags($commit);
-
-// Resolve branches and tags
-$all = $references->resolve($commit);
-```
-
-You can pass a *Commit* object or a hash to the method, gitlib will
-handle it.
diff --git a/vendor/gitonomy/gitlib/doc/repository.md b/vendor/gitonomy/gitlib/doc/repository.md
deleted file mode 100644
index 05b4a4e74..000000000
--- a/vendor/gitonomy/gitlib/doc/repository.md
+++ /dev/null
@@ -1,147 +0,0 @@
-Repository methods
-==================
-
-Creating a *Repository* object is possible, providing a *path* argument
-to the constructor:
-
-```php
-$repository = new Repository('/path/to/repo');
-```
-
-Repository options
-------------------
-
-The constructor of Repository takes an additional parameter: `$options`.
-This parameter can be used used to tune behavior of library.
-
-Available options are:
-
-- **debug** (default: true): Enables exception when edge cases are met
-- **environment\_variables**: (default: none) An array of environment
- variables to be set in sub-process
-- **logger**: (default: none) Logger to use for reporting of execution
- (a `Psr\Log\LoggerInterface`)
-- **command**: (default: `git`) Specify command to execute to run git
-- **working\_dir**: If you are using multiple working directories,
- this option is for you
-
-An example:
-
-```php
-$repository = new Repository('/path/to/repo', [
- 'debug' => true,
- 'logger' => new Monolog\Logger(),
-]);
-```
-
-Test if a repository is bare
-----------------------------
-
-On a *Repository* object, you can call method *isBare* to test if your
-repository is bare or not:
-
-```php
-$repository->isBare();
-```
-
-Compute size of a repository
-----------------------------
-
-To know how much size a repository is using on your drive, you can use
-`getSize` method on a *Repository* object.
-
-> **warning**
->
-> This command was only tested with linux.
-
-The returned size is in kilobytes:
-
-```php
-$size = $repository->getSize();
-
-echo 'Your repository size is '.$size.'KB';
-```
-
-Access HEAD
------------
-
-`HEAD` represents in git the version you are working on (in working
-tree). Your `HEAD` can be attached (using a reference) or detached
-(using a commit).
-
-```php
-$head = $repository->getHead(); // Commit or Reference
-$head = $repository->getHeadCommit(); // Commit
-
-if ($repository->isHeadDetached()) {
- echo 'Sorry man'.PHP_EOL;
-}
-```
-
-Options for repository
-----------------------
-
-### Logger
-
-If you are developing, you may appreciate to have a logger inside
-repository, telling you every executed command.
-
-You call method `setLogger` as an option on repository creation:
-
-```php
-$repository->setLogger(new Monolog\Logger('repository'));
-
-$repository->run('fetch', ['--all']);
-```
-
-You can also specify as an option on repository creation:
-
-```php
-$logger = new MonologLogger('repository');
-$repository = new Repository('/path/foo', ['logger' => $logger]);
-$repository->run('fetch', ['--all']);
-```
-
-This will output:
-
-```
-info run command: fetch "--all"
-debug last command (fetch) duration: 23.24ms
-debug last command (fetch) return code: 0
-debug last command (fetch) output: Fetching origin
-```
-
-### Disable debug-mode
-
-Gitlib throws an exception when something seems wrong. If a `git` command exits
-with a non-zero code, then execution will be stopped, and a `RuntimeException`
-will be thrown. If you want to prevent this, set the `debug` option to` false`.
-This will make `Repository` log errors and return empty data instead of
-throwing exceptions.
-
-```php
-$repository = new Repository('/tmp/foo', ['debug' => false, 'logger' => $logger]);
-```
-
-> **note**
->
-> If you plan to disable debug, you should rely on the logger to keep a trace
-> of the failing cases.
-
-### Specify git command to use
-
-You can pass the option `command` to specify which command to use to run git
-calls. If you have a git binary located somewhere else, use this option to
-specify to gitlib path to your git binary:
-
-```php
-$repository = new Gitonomy\Git\Repository('/tmp/foo', ['command' => '/home/alice/bin/git']);
-```
-
-### Environment variables
-
-It is possible to send environment variables to the `git` commands.
-
-```php
-$repository = new Gitonomy\Git\Repository('/tmp/foo', ['environment_variables' => ['GIT_']])
-```
diff --git a/vendor/gitonomy/gitlib/doc/revision.md b/vendor/gitonomy/gitlib/doc/revision.md
deleted file mode 100644
index 81370c80f..000000000
--- a/vendor/gitonomy/gitlib/doc/revision.md
+++ /dev/null
@@ -1,28 +0,0 @@
-Revision
-========
-
-To get a revision from a *Repository* object:
-
-```php
-$revision = $repository->getRevision('master@{2 days ago}');
-```
-
-Getting the log
----------------
-
-You can access a *Log* object starting from a revision using the
-*getLog* method. This method takes two parameters: *offset* and *limit*:
-
-```php
-// Returns 100 lasts commits
-$log = $revision->getLog(null, 100);
-```
-
-Resolve a revision
-------------------
-
-To resolve a revision to a commit:
-
-```php
-$commit = $revision->getCommit();
-```
diff --git a/vendor/gitonomy/gitlib/doc/tree.md b/vendor/gitonomy/gitlib/doc/tree.md
deleted file mode 100644
index 0c5c8ef7f..000000000
--- a/vendor/gitonomy/gitlib/doc/tree.md
+++ /dev/null
@@ -1,54 +0,0 @@
-Tree and files
-==============
-
-To organize folders, git uses trees. In gitlib, those trees are
-represented via *Tree* object.
-
-To get the root tree associated to a commit, use the *getTree* method on
-the commit object:
-
-```php
-$tree = $commit->getTree();
-```
-
-This tree is the entry point of all of your files.
-
-The main method for a tree is the *getEntries* method. This method will
-return an array, indexed by name. Each of those elements will be the
-entry mode and the entry object.
-
-Let's understand how it works with a concrete example:
-
-```php
-function displayTree(Tree $tree, $indent = 0)
-{
- $indent = str_repeat(' ', $indent);
- foreach ($tree->getEntries() as $name => $data) {
- list($mode, $entry) = $data;
- if ($entry instanceof Tree) {
- echo $indent.$name.'/'.PHP_EOL;
- displayTree($tree, $indent + 1);
- } else {
- echo $indent.$name.PHP_EOL;
- }
- }
-}
-
-displayTree($commit->getTree());
-```
-
-This method will recursively display all entries of a tree.
-
-Resolve a path
---------------
-
-To access directly a sub-file, the easier is probably to use the
-*resolvePath* method.
-
-An example:
-
-```php
-$source = $tree->resolvePath('src/Gitonomy/Git');
-
-$source instanceof Tree;
-```
diff --git a/vendor/gitonomy/gitlib/doc/workingcopy.md b/vendor/gitonomy/gitlib/doc/workingcopy.md
deleted file mode 100644
index 4ecea6c1b..000000000
--- a/vendor/gitonomy/gitlib/doc/workingcopy.md
+++ /dev/null
@@ -1,47 +0,0 @@
-Working copy
-============
-
-Working copy is the folder associated to a git repository. In *gitlib*,
-you can access this object using the *getWorkingCopy* on a *Repository*
-object:
-
-```php
-$repo = new Repository('/path/to/working-dir');
-$wc = $repo->getWorkingCopy();
-```
-
-Checkout a revision
--------------------
-
-You can checkout any revision using *checkout* method. You can also pass
-a second argument, which will be passed as argument with `-b`:
-
-```php
-// git checkout master
-$wc->checkout('master');
-
-// git checkout origin/master -b master
-$wc->checkout('origin/master', 'master');
-```
-
-You can also pass a *Reference* or a *Commit*.
-
-Staged modifications
---------------------
-
-You can get a diff of modifications pending in staging area. To get the
-`Diff` object, call method `getDiffStaged()`:
-
-```php
-$diff = $wc->getDiffStaged();
-```
-
-Pending modifications
----------------------
-
-You can get pending modifications on tracked files by calling method
-`getDiffPending()`:
-
-```php
-$diff = $wc->getDiffPending();
-```
diff --git a/vendor/gitonomy/gitlib/phpunit.xml.dist b/vendor/gitonomy/gitlib/phpunit.xml.dist
deleted file mode 100644
index 77fe62383..000000000
--- a/vendor/gitonomy/gitlib/phpunit.xml.dist
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- ./tests/Gitonomy/Git/Tests
-
-
-
-
- ./src/Gitonomy/Git
-
-
-
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Admin.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Admin.php
deleted file mode 100644
index 7b64cd77c..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Admin.php
+++ /dev/null
@@ -1,164 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Exception\RuntimeException;
-use Symfony\Component\Process\Process;
-
-/**
- * Administration class for Git repositories.
- *
- * @author Alexandre Salomé
- */
-class Admin
-{
- /**
- * Initializes a repository and returns the instance.
- *
- * @param string $path path to the repository
- * @param bool $bare indicate to create a bare repository
- * @param array $options options for Repository creation
- *
- * @throws RuntimeException Directory exists or not writable (only if debug=true)
- *
- * @return Repository
- */
- public static function init($path, $bare = true, array $options = [])
- {
- $process = static::getProcess('init', array_merge(['-q'], $bare ? ['--bare'] : [], [$path]), $options);
-
- $process->run();
-
- if (!$process->isSuccessFul()) {
- throw new RuntimeException(sprintf("Error on repository initialization, command wasn't successful (%s). Error output:\n%s", $process->getCommandLine(), $process->getErrorOutput()));
- }
-
- return new Repository($path, $options);
- }
-
- /**
- * Checks the validity of a git repository url without cloning it.
- *
- * This will use the `ls-remote` command of git against the given url.
- * Usually, this command returns 0 when successful, and 128 when the
- * repository is not found.
- *
- * @param string $url url of repository to check
- * @param array $options options for Repository creation
- *
- * @return bool true if url is valid
- */
- public static function isValidRepository($url, array $options = [])
- {
- $process = static::getProcess('ls-remote', [$url], $options);
-
- $process->run();
-
- return $process->isSuccessFul();
- }
-
- /**
- * Clone a repository to a local path.
- *
- * @param string $path indicates where to clone repository
- * @param string $url url of repository to clone
- * @param bool $bare indicates if repository should be bare or have a working copy
- * @param array $options options for Repository creation
- *
- * @return Repository
- */
- public static function cloneTo($path, $url, $bare = true, array $options = [])
- {
- $args = $bare ? ['--bare'] : [];
-
- return static::cloneRepository($path, $url, $args, $options);
- }
-
- /**
- * Clone a repository branch to a local path.
- *
- * @param string $path indicates where to clone repository
- * @param string $url url of repository to clone
- * @param string $branch branch to clone
- * @param bool $bare indicates if repository should be bare or have a working copy
- * @param array $options options for Repository creation
- *
- * @return Repository
- */
- public static function cloneBranchTo($path, $url, $branch, $bare = true, $options = [])
- {
- $args = ['--branch', $branch];
- if ($bare) {
- $args[] = '--bare';
- }
-
- return static::cloneRepository($path, $url, $args, $options);
- }
-
- /**
- * Mirrors a repository (fetch all revisions, not only branches).
- *
- * @param string $path indicates where to clone repository
- * @param string $url url of repository to clone
- * @param array $options options for Repository creation
- *
- * @return Repository
- */
- public static function mirrorTo($path, $url, array $options = [])
- {
- return static::cloneRepository($path, $url, ['--mirror'], $options);
- }
-
- /**
- * Internal method to launch effective ``git clone`` command.
- *
- * @param string $path indicates where to clone repository
- * @param string $url url of repository to clone
- * @param array $args arguments to be added to the command-line
- * @param array $options options for Repository creation
- *
- * @return Repository
- */
- public static function cloneRepository($path, $url, array $args = [], array $options = [])
- {
- $process = static::getProcess('clone', array_merge(['-q'], $args, [$url, $path]), $options);
-
- $process->run();
-
- if (!$process->isSuccessFul()) {
- throw new RuntimeException(sprintf('Error while initializing repository: %s', $process->getErrorOutput()));
- }
-
- return new Repository($path, $options);
- }
-
- /**
- * This internal method is used to create a process object.
- */
- private static function getProcess($command, array $args = [], array $options = [])
- {
- $is_windows = defined('PHP_WINDOWS_VERSION_BUILD');
- $options = array_merge([
- 'environment_variables' => $is_windows ? ['PATH' => getenv('PATH')] : [],
- 'command' => 'git',
- 'process_timeout' => 3600,
- ], $options);
-
- $process = new Process(array_merge([$options['command'], $command], $args));
- $process->setEnv($options['environment_variables']);
- $process->setTimeout($options['process_timeout']);
- $process->setIdleTimeout($options['process_timeout']);
-
- return $process;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blame.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blame.php
deleted file mode 100644
index dec0773bf..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blame.php
+++ /dev/null
@@ -1,145 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Blame\Line;
-use Gitonomy\Git\Exception\InvalidArgumentException;
-use Gitonomy\Git\Parser\BlameParser;
-
-/**
- * @author Alexandre Salomé
- */
-class Blame implements \Countable
-{
- /**
- * @var Repository
- */
- protected $repository;
-
- /**
- * @var Revision
- */
- protected $revision;
-
- /**
- * @var string
- */
- protected $file;
-
- /**
- * @var string|null
- */
- protected $lineRange;
-
- /**
- * @var array|null
- */
- protected $lines;
-
- /**
- * @param string $lineRange Argument to pass to git blame (-L).
- * Can be a line range (40,60 or 40,+21)
- * or a regexp ('/^function$/')
- */
- public function __construct(Repository $repository, Revision $revision, $file, $lineRange = null)
- {
- $this->repository = $repository;
- $this->revision = $revision;
- $this->lineRange = $lineRange;
- $this->file = $file;
- }
-
- /**
- * @return Line
- */
- public function getLine($number)
- {
- if ($number < 1) {
- throw new InvalidArgumentException('Line number should be at least 1');
- }
-
- $lines = $this->getLines();
-
- if (!isset($lines[$number])) {
- throw new InvalidArgumentException('Line does not exist');
- }
-
- return $lines[$number];
- }
-
- /**
- * Returns lines grouped by commit.
- *
- * @return array a list of two-elements array (commit, lines)
- */
- public function getGroupedLines()
- {
- $result = [];
- $commit = null;
- $current = [];
-
- foreach ($this->getLines() as $lineNumber => $line) {
- if ($commit !== $line->getCommit()) {
- if (count($current)) {
- $result[] = [$commit, $current];
- }
- $commit = $line->getCommit();
- $current = [];
- }
-
- $current[$lineNumber] = $line;
- }
-
- if (count($current)) {
- $result[] = [$commit, $current];
- }
-
- return $result;
- }
-
- /**
- * @return Line[] All lines of the blame.
- */
- public function getLines()
- {
- if (null !== $this->lines) {
- return $this->lines;
- }
-
- $args = ['-p'];
-
- if (null !== $this->lineRange) {
- $args[] = '-L';
- $args[] = $this->lineRange;
- }
-
- $args[] = $this->revision->getRevision();
- $args[] = '--';
- $args[] = $this->file;
-
- $parser = new BlameParser($this->repository);
- $parser->parse($this->repository->run('blame', $args));
- $this->lines = $parser->lines;
-
- return $this->lines;
- }
-
- /**
- * @return int
- */
- #[\ReturnTypeWillChange]
- public function count()
- {
- return count($this->getLines());
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blame/Line.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blame/Line.php
deleted file mode 100644
index 83a7a9129..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blame/Line.php
+++ /dev/null
@@ -1,57 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Blame;
-
-use Gitonomy\Git\Commit;
-
-/**
- * @author Alexandre Salomé
- */
-class Line
-{
- /**
- * @var Commit
- */
- protected $commit;
- protected $sourceLine;
- protected $targetLine;
- protected $blockLine;
- protected $content;
-
- /**
- * Instanciates a new Line object.
- */
- public function __construct(Commit $commit, $sourceLine, $targetLine, $blockLine, $content)
- {
- $this->commit = $commit;
- $this->sourceLine = $sourceLine;
- $this->targetLine = $targetLine;
- $this->blockLine = $blockLine;
- $this->content = $content;
- }
-
- public function getContent()
- {
- return $this->content;
- }
-
- public function getLine()
- {
- return $this->sourceLine;
- }
-
- public function getCommit()
- {
- return $this->commit;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blob.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blob.php
deleted file mode 100644
index e455fe2aa..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Blob.php
+++ /dev/null
@@ -1,108 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-/**
- * Representation of a Blob commit.
- *
- * @author Alexandre Salomé
- */
-class Blob
-{
- /**
- * @var Repository
- */
- protected $repository;
-
- /**
- * @var string
- */
- protected $hash;
-
- /**
- * @var string
- */
- protected $content;
-
- /**
- * @var string
- */
- protected $mimetype;
-
- /**
- * @param Repository $repository Repository where the blob is located
- * @param string $hash Hash of the blob
- */
- public function __construct(Repository $repository, $hash)
- {
- $this->repository = $repository;
- $this->hash = $hash;
- }
-
- /**
- * @return string
- */
- public function getHash()
- {
- return $this->hash;
- }
-
- /**
- * @throws ProcessException Error occurred while getting content of blob
- *
- * @return string Content of the blob.
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = $this->repository->run('cat-file', ['-p', $this->hash]);
- }
-
- return $this->content;
- }
-
- /**
- * Determine the mimetype of the blob.
- *
- * @return string A mimetype
- */
- public function getMimetype()
- {
- if (null === $this->mimetype) {
- $finfo = new \finfo(FILEINFO_MIME);
- $this->mimetype = $finfo->buffer($this->getContent());
- }
-
- return $this->mimetype;
- }
-
- /**
- * Determines if file is binary.
- *
- * @return bool
- */
- public function isBinary()
- {
- return !$this->isText();
- }
-
- /**
- * Determines if file is text.
- *
- * @return bool
- */
- public function isText()
- {
- return (bool) preg_match('#^text/|^application/xml#', $this->getMimetype());
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Commit.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Commit.php
deleted file mode 100644
index 2008f7a3f..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Commit.php
+++ /dev/null
@@ -1,414 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Diff\Diff;
-use Gitonomy\Git\Exception\InvalidArgumentException;
-use Gitonomy\Git\Exception\ProcessException;
-use Gitonomy\Git\Exception\ReferenceNotFoundException;
-use Gitonomy\Git\Reference\Branch;
-use Gitonomy\Git\Util\StringHelper;
-
-/**
- * Representation of a Git commit.
- *
- * @author Alexandre Salomé
- */
-class Commit extends Revision
-{
- /**
- * Associative array of commit data.
- *
- * @var array
- */
- private $data = [];
-
- /**
- * Constructor.
- *
- * @param Repository $repository Repository of the commit
- * @param string $hash Hash of the commit
- */
- public function __construct(Repository $repository, $hash, array $data = [])
- {
- if (!preg_match('/^[a-f0-9]{40}$/', $hash)) {
- throw new ReferenceNotFoundException($hash);
- }
-
- parent::__construct($repository, $hash);
-
- $this->setData($data);
- }
-
- public function setData(array $data)
- {
- foreach ($data as $name => $value) {
- $this->data[$name] = $value;
- }
- }
-
- /**
- * @return Diff
- */
- public function getDiff()
- {
- $args = ['-r', '-p', '-m', '-M', '--no-commit-id', '--full-index', $this->revision];
-
- $diff = Diff::parse($this->repository->run('diff-tree', $args));
- $diff->setRepository($this->repository);
-
- return $diff;
- }
-
- /**
- * Returns the commit hash.
- *
- * @return string A SHA1 hash
- */
- public function getHash()
- {
- return $this->revision;
- }
-
- /**
- * Returns the short commit hash.
- *
- * @return string A SHA1 hash
- */
- public function getShortHash()
- {
- return $this->getData('shortHash');
- }
-
- /**
- * Returns a fixed-with short hash.
- *
- * @return string Short hash
- */
- public function getFixedShortHash($length = 6)
- {
- return StringHelper::substr($this->revision, 0, $length);
- }
-
- /**
- * Returns parent hashes.
- *
- * @return string[] An array of SHA1 hashes
- */
- public function getParentHashes()
- {
- return $this->getData('parentHashes');
- }
-
- /**
- * Returns the parent commits.
- *
- * @return Commit[] An array of Commit objects
- */
- public function getParents()
- {
- $result = [];
- foreach ($this->getData('parentHashes') as $parentHash) {
- $result[] = $this->repository->getCommit($parentHash);
- }
-
- return $result;
- }
-
- /**
- * Returns the tree hash.
- *
- * @return string A SHA1 hash
- */
- public function getTreeHash()
- {
- return $this->getData('treeHash');
- }
-
- /**
- * @return Tree
- */
- public function getTree()
- {
- return $this->getData('tree');
- }
-
- /**
- * @return Commit
- */
- public function getLastModification($path = null)
- {
- if (0 === strpos($path, '/')) {
- $path = StringHelper::substr($path, 1);
- }
-
- if ($getWorkingDir = $this->repository->getWorkingDir()) {
- $path = $getWorkingDir.'/'.$path;
- }
-
- $result = $this->repository->run('log', ['--format=%H', '-n', 1, $this->revision, '--', $path]);
-
- return $this->repository->getCommit(trim($result));
- }
-
- /**
- * Returns the first line of the commit, and the first 50 characters.
- *
- * Ported from https://github.com/fabpot/Twig-extensions/blob/d67bc7e69788795d7905b52d31188bbc1d390e01/lib/Twig/Extensions/Extension/Text.php#L52-L109
- *
- * @param int $length
- * @param bool $preserve
- * @param string $separator
- *
- * @return string
- */
- public function getShortMessage($length = 50, $preserve = false, $separator = '...')
- {
- $message = $this->getData('subjectMessage');
-
- if (StringHelper::strlen($message) > $length) {
- if ($preserve && false !== ($breakpoint = StringHelper::strpos($message, ' ', $length))) {
- $length = $breakpoint;
- }
-
- return rtrim(StringHelper::substr($message, 0, $length)).$separator;
- }
-
- return $message;
- }
-
- /**
- * Resolves all references associated to this commit.
- *
- * @return Reference[] An array of references (Branch, Tag, Squash)
- */
- public function resolveReferences()
- {
- return $this->repository->getReferences()->resolve($this);
- }
-
- /**
- * Find branch containing the commit.
- *
- * @param bool $local set true to try to locate a commit on local repository
- * @param bool $remote set true to try to locate a commit on remote repository
- *
- * @return Reference[]|Branch[] An array of Reference\Branch
- */
- public function getIncludingBranches($local = true, $remote = true)
- {
- $arguments = ['--contains', $this->revision];
-
- if ($local && $remote) {
- $arguments[] = '-a';
- } elseif (!$local && $remote) {
- $arguments[] = '-r';
- } elseif (!$local && !$remote) {
- throw new InvalidArgumentException('You should a least set one argument to true');
- }
-
- try {
- $result = $this->repository->run('branch', $arguments);
- } catch (ProcessException $e) {
- return [];
- }
-
- if (!$result) {
- return [];
- }
-
- $branchesName = explode("\n", trim(str_replace('*', '', $result)));
- $branchesName = array_filter($branchesName, function ($v) {
- return false === StringHelper::strpos($v, '->');
- });
- $branchesName = array_map('trim', $branchesName);
-
- $references = $this->repository->getReferences();
-
- $branches = [];
- foreach ($branchesName as $branchName) {
- if (false === $local) {
- $branches[] = $references->getRemoteBranch($branchName);
- } elseif (0 === StringHelper::strrpos($branchName, 'remotes/')) {
- $branches[] = $references->getRemoteBranch(str_replace('remotes/', '', $branchName));
- } else {
- $branches[] = $references->getBranch($branchName);
- }
- }
-
- return $branches;
- }
-
- /**
- * Returns the author name.
- *
- * @return string A name
- */
- public function getAuthorName()
- {
- return $this->getData('authorName');
- }
-
- /**
- * Returns the author email.
- *
- * @return string An email
- */
- public function getAuthorEmail()
- {
- return $this->getData('authorEmail');
- }
-
- /**
- * Returns the authoring date.
- *
- * @return \DateTime A time object
- */
- public function getAuthorDate()
- {
- return $this->getData('authorDate');
- }
-
- /**
- * Returns the committer name.
- *
- * @return string A name
- */
- public function getCommitterName()
- {
- return $this->getData('committerName');
- }
-
- /**
- * Returns the comitter email.
- *
- * @return string An email
- */
- public function getCommitterEmail()
- {
- return $this->getData('committerEmail');
- }
-
- /**
- * Returns the authoring date.
- *
- * @return \DateTime A time object
- */
- public function getCommitterDate()
- {
- return $this->getData('committerDate');
- }
-
- /**
- * Returns the message of the commit.
- *
- * @return string A commit message
- */
- public function getMessage()
- {
- return $this->getData('message');
- }
-
- /**
- * Returns the subject message (the first line).
- *
- * @return string The subject message
- */
- public function getSubjectMessage()
- {
- return $this->getData('subjectMessage');
- }
-
- /**
- * Return the body message.
- *
- * @return string The body message
- */
- public function getBodyMessage()
- {
- return $this->getData('bodyMessage');
- }
-
- /**
- * {@inheritdoc}
- */
- public function getCommit()
- {
- return $this;
- }
-
- private function getData($name)
- {
- if (isset($this->data[$name])) {
- return $this->data[$name];
- }
-
- if ($name === 'shortHash') {
- $this->data['shortHash'] = trim($this->repository->run('log', ['--abbrev-commit', '--format=%h', '-n', 1, $this->revision]));
-
- return $this->data['shortHash'];
- }
-
- if ($name === 'tree') {
- $this->data['tree'] = $this->repository->getTree($this->getData('treeHash'));
-
- return $this->data['tree'];
- }
-
- if ($name === 'subjectMessage') {
- $lines = explode("\n", $this->getData('message'));
- $this->data['subjectMessage'] = reset($lines);
-
- return $this->data['subjectMessage'];
- }
-
- if ($name === 'bodyMessage') {
- $message = $this->getData('message');
-
- $lines = explode("\n", $message);
-
- array_shift($lines);
- array_shift($lines);
-
- $data['bodyMessage'] = implode("\n", $lines);
-
- return $data['bodyMessage'];
- }
-
- $parser = new Parser\CommitParser();
-
- try {
- $result = $this->repository->run('cat-file', ['commit', $this->revision]);
- } catch (ProcessException $e) {
- throw new ReferenceNotFoundException(sprintf('Can not find reference "%s"', $this->revision));
- }
-
- $parser->parse($result);
-
- $this->data['treeHash'] = $parser->tree;
- $this->data['parentHashes'] = $parser->parents;
- $this->data['authorName'] = $parser->authorName;
- $this->data['authorEmail'] = $parser->authorEmail;
- $this->data['authorDate'] = $parser->authorDate;
- $this->data['committerName'] = $parser->committerName;
- $this->data['committerEmail'] = $parser->committerEmail;
- $this->data['committerDate'] = $parser->committerDate;
- $this->data['message'] = $parser->message;
-
- if (!isset($this->data[$name])) {
- throw new \InvalidArgumentException(sprintf('No data named "%s" in Commit.', $name));
- }
-
- return $this->data[$name];
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/CommitReference.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/CommitReference.php
deleted file mode 100644
index 7be3d89ce..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/CommitReference.php
+++ /dev/null
@@ -1,26 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-class CommitReference
-{
- /**
- * @var string
- */
- private $hash;
-
- public function __construct($hash)
- {
- $this->hash = $hash;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/Diff.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/Diff.php
deleted file mode 100644
index 7737ee8fa..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/Diff.php
+++ /dev/null
@@ -1,122 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Diff;
-
-use Gitonomy\Git\Parser\DiffParser;
-use Gitonomy\Git\Repository;
-
-/**
- * Representation of a diff.
- *
- * @author Alexandre Salomé
- */
-class Diff
-{
- /**
- * @var File[]
- */
- protected $files;
-
- /**
- * @var string
- */
- protected $rawDiff;
-
- /**
- * Constructs a new diff for a given revision.
- *
- * @param array $files The files
- * @param string $rawDiff The raw diff
- */
- public function __construct(array $files, $rawDiff)
- {
- $this->files = $files;
- $this->rawDiff = $rawDiff;
- }
-
- /**
- * @return Diff
- */
- public static function parse($rawDiff)
- {
- $parser = new DiffParser();
- $parser->parse($rawDiff);
-
- return new self($parser->files, $rawDiff);
- }
-
- public function setRepository(Repository $repository)
- {
- foreach ($this->files as $file) {
- $file->setRepository($repository);
- }
- }
-
- /**
- * Get list of files modified in the diff's revision.
- *
- * @return File[] An array of Diff\File objects
- */
- public function getFiles()
- {
- return $this->files;
- }
-
- /**
- * Returns the raw diff.
- *
- * @return string The raw diff
- */
- public function getRawDiff()
- {
- return $this->rawDiff;
- }
-
- /**
- * Export a diff as array.
- *
- * @return array The array
- */
- public function toArray()
- {
- return [
- 'rawDiff' => $this->rawDiff,
- 'files' => array_map(
- function (File $file) {
- return $file->toArray();
- },
- $this->files
- ),
- ];
- }
-
- /**
- * Create a new instance of Diff from an array.
- *
- * @param array $array The array
- *
- * @return Diff The new instance
- */
- public static function fromArray(array $array)
- {
- return new static(
- array_map(
- function ($array) {
- return File::fromArray($array);
- },
- $array['files']
- ),
- $array['rawDiff']
- );
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/File.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/File.php
deleted file mode 100644
index d3da24bb3..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/File.php
+++ /dev/null
@@ -1,296 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Diff;
-
-use Gitonomy\Git\Repository;
-
-/**
- * @author Alexandre Salomé
- */
-class File
-{
- /**
- * @var string
- */
- protected $oldName;
-
- /**
- * @var string
- */
- protected $newName;
-
- /**
- * @var string
- */
- protected $oldMode;
-
- /**
- * @var string
- */
- protected $newMode;
-
- /**
- * @var string
- */
- protected $oldIndex;
-
- /**
- * @var string
- */
- protected $newIndex;
-
- /**
- * @var bool
- */
- protected $isBinary;
-
- /**
- * @var FileChange[] An array of FileChange objects
- */
- protected $changes;
-
- /**
- * @var Repository
- */
- protected $repository;
-
- /**
- * Instanciates a new File object.
- */
- public function __construct($oldName, $newName, $oldMode, $newMode, $oldIndex, $newIndex, $isBinary)
- {
- $this->oldName = $oldName;
- $this->newName = $newName;
- $this->oldMode = $oldMode;
- $this->newMode = $newMode;
- $this->oldIndex = $oldIndex;
- $this->newIndex = $newIndex;
- $this->isBinary = $isBinary;
-
- $this->changes = [];
- }
-
- public function addChange(FileChange $change)
- {
- $this->changes[] = $change;
- }
-
- /**
- * Indicates if this diff file is a creation.
- *
- * @return bool
- */
- public function isCreation()
- {
- return null === $this->oldName;
- }
-
- /**
- * Indicates if this diff file is a modification.
- *
- * @return bool
- */
- public function isModification()
- {
- return null !== $this->oldName && null !== $this->newName;
- }
-
- /**
- * Indicates if it's a rename.
- *
- * A rename can only occurs if it's a modification (not a creation or a deletion).
- *
- * @return bool
- */
- public function isRename()
- {
- return $this->isModification() && $this->oldName !== $this->newName;
- }
-
- /**
- * Indicates if the file mode has changed.
- */
- public function isChangeMode()
- {
- return $this->isModification() && $this->oldMode !== $this->newMode;
- }
-
- /**
- * Indicates if this diff file is a deletion.
- *
- * @return bool
- */
- public function isDeletion()
- {
- return null === $this->newName;
- }
-
- /**
- * Indicates if this diff file is a deletion.
- *
- * @return bool
- */
- public function isDelete()
- {
- return null === $this->newName;
- }
-
- /**
- * @return int Number of added lines
- */
- public function getAdditions()
- {
- $result = 0;
- foreach ($this->changes as $change) {
- $result += $change->getCount(FileChange::LINE_ADD);
- }
-
- return $result;
- }
-
- /**
- * @return int Number of deleted lines
- */
- public function getDeletions()
- {
- $result = 0;
- foreach ($this->changes as $change) {
- $result += $change->getCount(FileChange::LINE_REMOVE);
- }
-
- return $result;
- }
-
- public function getOldName()
- {
- return $this->oldName;
- }
-
- public function getNewName()
- {
- return $this->newName;
- }
-
- public function getName()
- {
- if (null === $this->newName) {
- return $this->oldName;
- }
-
- return $this->newName;
- }
-
- public function getOldMode()
- {
- return $this->oldMode;
- }
-
- public function getNewMode()
- {
- return $this->newMode;
- }
-
- public function getOldIndex()
- {
- return $this->oldIndex;
- }
-
- public function getNewIndex()
- {
- return $this->newIndex;
- }
-
- public function isBinary()
- {
- return $this->isBinary;
- }
-
- /**
- * @return FileChange[]
- */
- public function getChanges()
- {
- return $this->changes;
- }
-
- public function toArray()
- {
- return [
- 'old_name' => $this->oldName,
- 'new_name' => $this->newName,
- 'old_mode' => $this->oldMode,
- 'new_mode' => $this->newMode,
- 'old_index' => $this->oldIndex,
- 'new_index' => $this->newIndex,
- 'is_binary' => $this->isBinary,
- 'changes' => array_map(function (FileChange $change) {
- return $change->toArray();
- }, $this->changes),
- ];
- }
-
- /**
- * @return File
- */
- public static function fromArray(array $array)
- {
- $file = new self($array['old_name'], $array['new_name'], $array['old_mode'], $array['new_mode'], $array['old_index'], $array['new_index'], $array['is_binary']);
-
- foreach ($array['changes'] as $change) {
- $file->addChange(FileChange::fromArray($change));
- }
-
- return $file;
- }
-
- public function getAnchor()
- {
- return substr($this->newIndex, 0, 12);
- }
-
- public function getRepository()
- {
- return $this->repository;
- }
-
- public function setRepository(Repository $repository)
- {
- $this->repository = $repository;
- }
-
- public function getOldBlob()
- {
- if (null === $this->repository) {
- throw new \RuntimeException('Repository is missing to return Blob object.');
- }
-
- if ($this->isCreation()) {
- throw new \LogicException('Can\'t return old Blob on a creation');
- }
-
- return $this->repository->getBlob($this->oldIndex);
- }
-
- public function getNewBlob()
- {
- if (null === $this->repository) {
- throw new \RuntimeException('Repository is missing to return Blob object.');
- }
-
- if ($this->isDeletion()) {
- throw new \LogicException('Can\'t return new Blob on a deletion');
- }
-
- return $this->repository->getBlob($this->newIndex);
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/FileChange.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/FileChange.php
deleted file mode 100644
index cca18dc63..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Diff/FileChange.php
+++ /dev/null
@@ -1,123 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Diff;
-
-class FileChange
-{
- const LINE_CONTEXT = 0;
- const LINE_REMOVE = -1;
- const LINE_ADD = 1;
-
- protected $rangeOldStart;
- protected $rangeOldCount;
- protected $rangeNewStart;
- protected $rangeNewCount;
- protected $lines;
-
- /**
- * @param int $rangeOldStart
- * @param int $rangeOldCount
- * @param int $rangeNewStart
- * @param int $rangeNewCount
- * @param array $lines
- *
- * @return void
- */
- public function __construct($rangeOldStart, $rangeOldCount, $rangeNewStart, $rangeNewCount, $lines)
- {
- $this->rangeOldStart = $rangeOldStart;
- $this->rangeOldCount = $rangeOldCount;
- $this->rangeNewStart = $rangeNewStart;
- $this->rangeNewCount = $rangeNewCount;
- $this->lines = $lines;
- }
-
- /**
- * @return int
- */
- public function getCount($type)
- {
- $result = 0;
- foreach ($this->lines as $line) {
- if ($line[0] === $type) {
- $result++;
- }
- }
-
- return $result;
- }
-
- /**
- * @return int
- */
- public function getRangeOldStart()
- {
- return $this->rangeOldStart;
- }
-
- /**
- * @return int
- */
- public function getRangeOldCount()
- {
- return $this->rangeOldCount;
- }
-
- /**
- * @return int
- */
- public function getRangeNewStart()
- {
- return $this->rangeNewStart;
- }
-
- /**
- * @return int
- */
- public function getRangeNewCount()
- {
- return $this->rangeNewCount;
- }
-
- /**
- * @return array
- */
- public function getLines()
- {
- return $this->lines;
- }
-
- /**
- * @return array
- */
- public function toArray()
- {
- return [
- 'range_old_start' => $this->rangeOldStart,
- 'range_old_count' => $this->rangeOldCount,
- 'range_new_start' => $this->rangeNewStart,
- 'range_new_count' => $this->rangeNewCount,
- 'lines' => $this->lines,
- ];
- }
-
- /**
- * @param array $array
- *
- * @return self
- */
- public static function fromArray(array $array)
- {
- return new self($array['range_old_start'], $array['range_old_count'], $array['range_new_start'], $array['range_new_count'], $array['lines']);
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/GitExceptionInterface.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/GitExceptionInterface.php
deleted file mode 100644
index 6e7e38986..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/GitExceptionInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Exception;
-
-interface GitExceptionInterface
-{
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/InvalidArgumentException.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/InvalidArgumentException.php
deleted file mode 100644
index 32b01b6fc..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/InvalidArgumentException.php
+++ /dev/null
@@ -1,7 +0,0 @@
-getCommandLine()."\n".
- "\n".
- $process->getErrorOutput()."\n".
- "\n".
- $process->getOutput()
- );
-
- $this->process = $process;
- }
-
- public function getErrorOutput()
- {
- return $this->process->getErrorOutput();
- }
-
- public function getOutput()
- {
- return $this->process->getOutput();
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/ReferenceNotFoundException.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/ReferenceNotFoundException.php
deleted file mode 100644
index dd9ae98d7..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/ReferenceNotFoundException.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Exception;
-
-class ReferenceNotFoundException extends \InvalidArgumentException implements GitExceptionInterface
-{
- public function __construct($reference)
- {
- parent::__construct(sprintf('Reference not found: "%s"', $reference));
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/RuntimeException.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/RuntimeException.php
deleted file mode 100644
index 06a76d8d7..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Exception/RuntimeException.php
+++ /dev/null
@@ -1,7 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Exception\InvalidArgumentException;
-use Gitonomy\Git\Exception\LogicException;
-use Gitonomy\Git\Exception\RuntimeException;
-
-/**
- * Hooks collection, aggregated by repository.
- *
- * @author Alexandre Salomé
- */
-class Hooks
-{
- /**
- * @var \Gitonomy\Git\Repository
- */
- protected $repository;
-
- /**
- * @var Repository
- */
- public function __construct(Repository $repository)
- {
- $this->repository = $repository;
- }
-
- /**
- * Tests if repository has a given hook.
- *
- * @param string $name Name of the hook
- *
- * @return bool
- */
- public function has($name)
- {
- return file_exists($this->getPath($name));
- }
-
- /**
- * Fetches content of a hook.
- *
- * @param string $name Name of the hook
- *
- * @throws InvalidArgumentException Hook does not exist
- *
- * @return string Content of the hook
- */
- public function get($name)
- {
- if (!$this->has($name)) {
- throw new InvalidArgumentException(sprintf('Hook named "%s" is not present', $name));
- }
-
- return file_get_contents($this->getPath($name));
- }
-
- /**
- * Insert a hook in repository using a symlink.
- *
- * @param string $name Name of the hook to insert
- * @param string $file Target of symlink
- *
- * @throws LogicException Hook is already present
- * @throws RuntimeException Error on symlink creation
- */
- public function setSymlink($name, $file)
- {
- if ($this->has($name)) {
- throw new LogicException(sprintf('A hook "%s" is already defined', $name));
- }
-
- $path = $this->getPath($name);
- if (false === symlink($file, $path)) {
- throw new RuntimeException(sprintf('Unable to create hook "%s" (%s)', $name, $path));
- }
- }
-
- /**
- * Set a hook in repository.
- *
- * @param string $name Name of the hook
- * @param string $content Content of the hook
- *
- * @throws LogicException The hook is already defined
- */
- public function set($name, $content)
- {
- if ($this->has($name)) {
- throw new LogicException(sprintf('A hook "%s" is already defined', $name));
- }
-
- $path = $this->getPath($name);
- file_put_contents($path, $content);
- chmod($path, 0777);
- }
-
- /**
- * Removes a hook from repository.
- *
- * @param string $name Name of the hook
- *
- * @throws LogicException The hook is not present
- */
- public function remove($name)
- {
- if (!$this->has($name)) {
- throw new LogicException(sprintf('The hook "%s" was not found', $name));
- }
-
- unlink($this->getPath($name));
- }
-
- /**
- * @return string
- */
- protected function getPath($name)
- {
- return $this->repository->getGitDir().'/hooks/'.$name;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Log.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Log.php
deleted file mode 100644
index 476653595..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Log.php
+++ /dev/null
@@ -1,239 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Diff\Diff;
-use Gitonomy\Git\Exception\ProcessException;
-use Gitonomy\Git\Exception\ReferenceNotFoundException;
-use Gitonomy\Git\Util\StringHelper;
-
-/**
- * @author Alexandre Salomé
- */
-class Log implements \Countable, \IteratorAggregate
-{
- /**
- * @var Repository
- */
- protected $repository;
-
- /**
- * @var null|RevisionList
- */
- protected $revisions;
-
- /**
- * @var array
- */
- protected $paths;
-
- /**
- * @var int
- */
- protected $offset;
-
- /**
- * @var int
- */
- protected $limit;
-
- /**
- * Instanciates a git log object.
- *
- * @param Repository $repository the repository where log occurs
- * @param RevisionList|Revision|array|null $revisions a list of revisions or null if you want all history
- * @param array $paths paths to filter on
- * @param int|null $offset start list from a given position
- * @param int|null $limit limit number of fetched elements
- */
- public function __construct(Repository $repository, $revisions = null, $paths = null, $offset = null, $limit = null)
- {
- if (null !== $revisions && !$revisions instanceof RevisionList) {
- $revisions = new RevisionList($repository, $revisions);
- }
-
- if (null === $paths) {
- $paths = [];
- } elseif (is_string($paths)) {
- $paths = [$paths];
- } elseif (!is_array($paths)) {
- throw new \InvalidArgumentException(sprintf('Expected a string or an array, got a "%s".', is_object($paths) ? get_class($paths) : gettype($paths)));
- }
-
- $this->repository = $repository;
- $this->revisions = $revisions;
- $this->paths = $paths;
- $this->offset = $offset;
- $this->limit = $limit;
- }
-
- /**
- * @return Diff
- */
- public function getDiff()
- {
- return $this->repository->getDiff($this->revisions);
- }
-
- /**
- * @return RevisionList
- */
- public function getRevisions()
- {
- return $this->revisions;
- }
-
- /**
- * @return array
- */
- public function getPaths()
- {
- return $this->paths;
- }
-
- /**
- * @return int
- */
- public function getOffset()
- {
- return $this->offset;
- }
-
- /**
- * @param int $offset
- */
- public function setOffset($offset)
- {
- $this->offset = $offset;
-
- return $this;
- }
-
- /**
- * @return int
- */
- public function getLimit()
- {
- return $this->limit;
- }
-
- /**
- * @param int $limit
- */
- public function setLimit($limit)
- {
- $this->limit = $limit;
-
- return $this;
- }
-
- /**
- * @return Commit
- */
- public function getSingleCommit()
- {
- $limit = $this->limit;
- $this->limit = 1;
- $commits = $this->getCommits();
- $this->setLimit($limit);
-
- if (count($commits) === 0) {
- throw new ReferenceNotFoundException('The log is empty');
- }
-
- return array_pop($commits);
- }
-
- /**
- * @return Commit[]
- */
- public function getCommits()
- {
- $args = ['--encoding='.StringHelper::getEncoding(), '--format=raw'];
-
- if (null !== $this->offset) {
- $args[] = '--skip='.((int) $this->offset);
- }
-
- if (null !== $this->limit) {
- $args[] = '-n';
- $args[] = (int) $this->limit;
- }
-
- if (null !== $this->revisions) {
- $args = array_merge($args, $this->revisions->getAsTextArray());
- } else {
- $args[] = '--all';
- }
-
- $args[] = '--';
-
- $args = array_merge($args, $this->paths);
-
- try {
- $output = $this->repository->run('log', $args);
- } catch (ProcessException $e) {
- throw new ReferenceNotFoundException(sprintf('Can not find revision "%s"', implode(' ', $this->revisions->getAsTextArray())), null, $e);
- }
-
- $parser = new Parser\LogParser();
- $parser->parse($output);
-
- $result = [];
- foreach ($parser->log as $commitData) {
- $hash = $commitData['id'];
- unset($commitData['id']);
-
- $commit = $this->repository->getCommit($hash);
- $commit->setData($commitData);
-
- $result[] = $commit;
- }
-
- return $result;
- }
-
- /**
- * @see Countable
- */
- #[\ReturnTypeWillChange]
- public function count()
- {
- return $this->countCommits();
- }
-
- /**
- * @see IteratorAggregate
- */
- #[\ReturnTypeWillChange]
- public function getIterator()
- {
- return new \ArrayIterator($this->getCommits());
- }
-
- /**
- * Count commits, without offset or limit.
- *
- * @return int
- */
- public function countCommits()
- {
- if (null !== $this->revisions && count($this->revisions)) {
- $output = $this->repository->run('rev-list', array_merge(['--count'], $this->revisions->getAsTextArray(), ['--'], $this->paths));
- } else {
- $output = $this->repository->run('rev-list', array_merge(['--count', '--all', '--'], $this->paths));
- }
-
- return (int) $output;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/BlameParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/BlameParser.php
deleted file mode 100644
index 8dd6c570d..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/BlameParser.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-use Gitonomy\Git\Blame\Line;
-use Gitonomy\Git\Repository;
-
-class BlameParser extends ParserBase
-{
- public $lines;
-
- protected $repository;
-
- public function __construct(Repository $repository)
- {
- $this->repository = $repository;
- }
-
- protected function doParse()
- {
- $this->lines = [];
-
- $memory = [];
-
- $line = 1;
- while (!$this->isFinished()) {
- $hash = $this->consumeHash();
- $this->consume(' ');
- $vars = $this->consumeRegexp('/(\d+) (\d+)( (\d+))?/A');
- $sourceLine = $vars[1];
- $targetLine = $vars[2];
- $blockLine = isset($vars[4]) ? $vars[4] : null;
- $this->consumeTo("\n");
- $this->consumeNewLine();
-
- if (!isset($memory[$hash])) {
- foreach (['author', 'author-mail', 'author-time', 'author-tz',
- 'committer', 'committer-mail', 'committer-time', 'committer-tz',
- 'summary', ] as $key) {
- $this->consume($key);
- $this->consumeTo("\n");
- $this->consumeNewLine();
- }
-
- if ($this->expects('previous ')) {
- $this->consumeTo("\n");
- $this->consumeNewLine();
- }
-
- if ($this->expects('boundary')) {
- $this->consumeNewLine();
- }
- $this->consume('filename');
- $this->consumeTo("\n"); // filename
- $this->consumeNewLine();
- $memory[$hash] = $this->repository->getCommit($hash);
- }
- $content = $this->consumeTo("\n"); // content of line
- $this->consumeNewLine();
-
- $this->lines[$line] = new Line($memory[$hash], $sourceLine, $targetLine, $blockLine, $content);
- $line++;
- }
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/CommitParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/CommitParser.php
deleted file mode 100644
index 98234f6d4..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/CommitParser.php
+++ /dev/null
@@ -1,80 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-use Gitonomy\Git\Exception\RuntimeException;
-
-class CommitParser extends ParserBase
-{
- public $tree;
- public $parents;
- public $authorName;
- public $authorEmail;
- public $authorDate;
- public $committerName;
- public $committerEmail;
- public $committerDate;
- public $message;
-
- protected function doParse()
- {
- $this->consume('tree ');
- $this->tree = $this->consumeHash();
- $this->consumeNewLine();
-
- $this->parents = [];
- while ($this->expects('parent ')) {
- $this->parents[] = $this->consumeHash();
- $this->consumeNewLine();
- }
-
- $this->consume('author ');
- list($this->authorName, $this->authorEmail, $this->authorDate) = $this->consumeNameEmailDate();
- $this->authorDate = $this->parseDate($this->authorDate);
- $this->consumeNewLine();
-
- $this->consume('committer ');
- list($this->committerName, $this->committerEmail, $this->committerDate) = $this->consumeNameEmailDate();
- $this->committerDate = $this->parseDate($this->committerDate);
-
- // will consume an GPG signed commit if there is one
- $this->consumeGPGSignature();
-
- $this->consumeNewLine();
-
- $this->consumeNewLine();
- $this->message = $this->consumeAll();
- }
-
- protected function consumeNameEmailDate()
- {
- if (!preg_match('/(([^\n]*) <([^\n]*)> (\d+ [+-]\d{4}))/A', $this->content, $vars, 0, $this->cursor)) {
- throw new RuntimeException('Unable to parse name, email and date');
- }
-
- $this->cursor += strlen($vars[1]);
-
- return [$vars[2], $vars[3], $vars[4]];
- }
-
- protected function parseDate($text)
- {
- $date = \DateTime::createFromFormat('U e O', $text.' UTC');
-
- if (!$date instanceof \DateTime) {
- throw new RuntimeException(sprintf('Unable to convert "%s" to datetime', $text));
- }
-
- return $date;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/DiffParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/DiffParser.php
deleted file mode 100644
index e14f879eb..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/DiffParser.php
+++ /dev/null
@@ -1,138 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-use Gitonomy\Git\Diff\File;
-use Gitonomy\Git\Diff\FileChange;
-
-class DiffParser extends ParserBase
-{
- public $files;
-
- protected function doParse()
- {
- $this->files = [];
-
- while (!$this->isFinished()) {
- // 1. title
- $vars = $this->consumeRegexp("/diff --git \"?(a\/.*?)\"? \"?(b\/.*?)\"?\n/");
- $oldName = $vars[1];
- $newName = $vars[2];
- $oldIndex = null;
- $newIndex = null;
- $oldMode = null;
- $newMode = null;
-
- // 2. mode
- if ($this->expects('new file mode ')) {
- $newMode = $this->consumeTo("\n");
- $this->consumeNewLine();
- $oldMode = null;
- }
- if ($this->expects('old mode ')) {
- $oldMode = $this->consumeTo("\n");
- $this->consumeNewLine();
- $this->consume('new mode ');
- $newMode = $this->consumeTo("\n");
- $this->consumeNewLine();
- }
- if ($this->expects('deleted file mode ')) {
- $oldMode = $this->consumeTo("\n");
- $newMode = null;
- $this->consumeNewLine();
- }
-
- if ($this->expects('similarity index ')) {
- $this->consumeRegexp('/\d{1,3}%\n/');
- $this->consume('rename from ');
- $this->consumeTo("\n");
- $this->consumeNewLine();
- $this->consume('rename to ');
- $this->consumeTo("\n");
- $this->consumeNewLine();
- }
-
- // 4. File informations
- $isBinary = false;
- if ($this->expects('index ')) {
- $oldIndex = $this->consumeShortHash();
- $this->consume('..');
- $newIndex = $this->consumeShortHash();
- if ($this->expects(' ')) {
- $vars = $this->consumeRegexp('/\d{6}/');
- $newMode = $oldMode = $vars[0];
- }
- $this->consumeNewLine();
-
- //verifying if the file was deleted or created
- if ($this->expects('--- ')) {
- $oldName = $this->consumeTo("\n") === '/dev/null' ? '/dev/null' : $oldName;
- $this->consumeNewLine();
- $this->consume('+++ ');
- $newName = $this->consumeTo("\n") === '/dev/null' ? '/dev/null' : $newName;
- $this->consumeNewLine();
- } elseif ($this->expects('Binary files ')) {
- $vars = $this->consumeRegexp('/"?(.*?)"? and "?(.*?)"? differ\n/');
- $isBinary = true;
- $oldName = $vars[1];
- $newName = $vars[2];
- }
- }
-
- $oldName = $oldName === '/dev/null' ? null : substr($oldName, 2);
- $newName = $newName === '/dev/null' ? null : substr($newName, 2);
-
- $oldIndex = $oldIndex !== null ?: '';
- $newIndex = $newIndex !== null ?: '';
- $oldIndex = preg_match('/^0+$/', $oldIndex) ? null : $oldIndex;
- $newIndex = preg_match('/^0+$/', $newIndex) ? null : $newIndex;
- $file = new File($oldName, $newName, $oldMode, $newMode, $oldIndex, $newIndex, $isBinary);
-
- // 5. Diff
- while ($this->expects('@@ ')) {
- $vars = $this->consumeRegexp('/-(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))?/');
- $rangeOldStart = (int) $vars[1];
- $rangeOldCount = (int) $vars[2];
- $rangeNewStart = (int) $vars[3];
- $rangeNewCount = isset($vars[4]) ? (int) $vars[4] : (int) $vars[2]; // @todo Ici, t'as pris un gros raccourci mon loulou
- $this->consume(' @@');
- $this->consumeTo("\n");
- $this->consumeNewLine();
-
- // 6. Lines
- $lines = [];
- while (true) {
- if ($this->expects(' ')) {
- $lines[] = [FileChange::LINE_CONTEXT, $this->consumeTo("\n")];
- } elseif ($this->expects('+')) {
- $lines[] = [FileChange::LINE_ADD, $this->consumeTo("\n")];
- } elseif ($this->expects('-')) {
- $lines[] = [FileChange::LINE_REMOVE, $this->consumeTo("\n")];
- } elseif ($this->expects("\ No newline at end of file")) {
- // Ignore this case...
- } else {
- break;
- }
-
- $this->consumeNewLine();
- }
-
- $change = new FileChange($rangeOldStart, $rangeOldCount, $rangeNewStart, $rangeNewCount, $lines);
-
- $file->addChange($change);
- }
-
- $this->files[] = $file;
- }
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/LogParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/LogParser.php
deleted file mode 100644
index 2672186e3..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/LogParser.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-class LogParser extends CommitParser
-{
- public $log = [];
-
- protected function doParse()
- {
- $this->log = [];
-
- while (!$this->isFinished()) {
- $commit = [];
- $this->consume('commit ');
- $commit['id'] = $this->consumeHash();
- $this->consumeNewLine();
-
- $this->consume('tree ');
- $commit['treeHash'] = $this->consumeHash();
- $this->consumeNewLine();
-
- $commit['parentHashes'] = [];
- while ($this->expects('parent ')) {
- $commit['parentHashes'][] = $this->consumeHash();
- $this->consumeNewLine();
- }
-
- $this->consume('author ');
- list($commit['authorName'], $commit['authorEmail'], $commit['authorDate']) = $this->consumeNameEmailDate();
- $commit['authorDate'] = $this->parseDate($commit['authorDate']);
- $this->consumeNewLine();
-
- $this->consume('committer ');
- list($commit['committerName'], $commit['committerEmail'], $commit['committerDate']) = $this->consumeNameEmailDate();
- $commit['committerDate'] = $this->parseDate($commit['committerDate']);
-
- // will consume an GPG signed commit if there is one
- $this->consumeGPGSignature();
-
- $this->consumeNewLine();
- $this->consumeNewLine();
-
- $message = '';
- if ($this->expects(' ')) {
- $this->cursor -= strlen(' ');
-
- while ($this->expects(' ')) {
- $message .= $this->consumeTo("\n")."\n";
- $this->consumeNewLine();
- }
- } else {
- $this->cursor--;
- }
-
- if (!$this->isFinished()) {
- $this->consumeNewLine();
- }
-
- $commit['message'] = $message;
-
- $this->log[] = $commit;
- }
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/ParserBase.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/ParserBase.php
deleted file mode 100644
index 7cd37e75e..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/ParserBase.php
+++ /dev/null
@@ -1,139 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-use Gitonomy\Git\Exception\RuntimeException;
-
-abstract class ParserBase
-{
- protected $cursor;
- protected $content;
- protected $length;
-
- abstract protected function doParse();
-
- public function parse($content)
- {
- $this->cursor = 0;
- $this->content = $content;
- $this->length = strlen($this->content);
-
- $this->doParse();
- }
-
- protected function isFinished()
- {
- return $this->cursor === $this->length;
- }
-
- protected function consumeAll()
- {
- $rest = substr($this->content, $this->cursor);
- $this->cursor += strlen($rest);
-
- return $rest;
- }
-
- protected function expects($expected)
- {
- $length = strlen($expected);
- $actual = substr($this->content, $this->cursor, $length);
- if ($actual !== $expected) {
- return false;
- }
-
- $this->cursor += $length;
-
- return true;
- }
-
- protected function consumeShortHash()
- {
- if (!preg_match('/([A-Za-z0-9]{7,40})/A', $this->content, $vars, 0, $this->cursor)) {
- throw new RuntimeException('No short hash found: '.substr($this->content, $this->cursor, 7));
- }
-
- $this->cursor += strlen($vars[1]);
-
- return $vars[1];
- }
-
- protected function consumeHash()
- {
- if (!preg_match('/([A-Za-z0-9]{40})/A', $this->content, $vars, 0, $this->cursor)) {
- throw new RuntimeException('No hash found: '.substr($this->content, $this->cursor, 40));
- }
-
- $this->cursor += 40;
-
- return $vars[1];
- }
-
- protected function consumeRegexp($regexp)
- {
- if (!preg_match($regexp.'A', $this->content, $vars, 0, $this->cursor)) {
- throw new RuntimeException('No match for regexp '.$regexp.' Upcoming: '.substr($this->content, $this->cursor, 500));
- }
-
- $this->cursor += strlen($vars[0]);
-
- return $vars;
- }
-
- protected function consumeTo($text)
- {
- $pos = strpos($this->content, $text, $this->cursor);
-
- if (false === $pos) {
- throw new RuntimeException(sprintf('Unable to find "%s"', $text));
- }
-
- $result = substr($this->content, $this->cursor, $pos - $this->cursor);
- $this->cursor = $pos;
-
- return $result;
- }
-
- protected function consume($expected)
- {
- $length = strlen($expected);
- $actual = substr($this->content, $this->cursor, $length);
- if ($actual !== $expected) {
- throw new RuntimeException(sprintf('Expected "%s", but got "%s" (%s)', $expected, $actual, substr($this->content, $this->cursor, 10)));
- }
- $this->cursor += $length;
-
- return $expected;
- }
-
- protected function consumeNewLine()
- {
- return $this->consume("\n");
- }
-
- /**
- * @return string
- */
- protected function consumeGPGSignature()
- {
- $expected = "\ngpgsig ";
- $length = strlen($expected);
- $actual = substr($this->content, $this->cursor, $length);
- if ($actual != $expected) {
- return '';
- }
- $this->cursor += $length;
-
- return $this->consumeTo("\n\n");
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/ReferenceParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/ReferenceParser.php
deleted file mode 100644
index 82e3a8b51..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/ReferenceParser.php
+++ /dev/null
@@ -1,31 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-class ReferenceParser extends ParserBase
-{
- public $references;
-
- protected function doParse()
- {
- $this->references = [];
-
- while (!$this->isFinished()) {
- $hash = $this->consumeHash();
- $this->consume(' ');
- $name = $this->consumeTo("\n");
- $this->consumeNewLine();
- $this->references[] = [$hash, $name];
- }
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/TagParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/TagParser.php
deleted file mode 100644
index 659be18a9..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/TagParser.php
+++ /dev/null
@@ -1,91 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-use Gitonomy\Git\Exception\RuntimeException;
-
-class TagParser extends ParserBase
-{
- public $object;
- public $type;
- public $tag;
- public $taggerName;
- public $taggerEmail;
- public $taggerDate;
- public $gpgSignature;
- public $message;
-
- protected function doParse()
- {
- $this->consume('object ');
- $this->object = $this->consumeHash();
- $this->consumeNewLine();
-
- $this->consume('type ');
- $this->type = $this->consumeTo("\n");
- $this->consumeNewLine();
-
- $this->consume('tag ');
- $this->tag = $this->consumeTo("\n");
- $this->consumeNewLine();
-
- $this->consume('tagger ');
- list($this->taggerName, $this->taggerEmail, $this->taggerDate) = $this->consumeNameEmailDate();
- $this->taggerDate = $this->parseDate($this->taggerDate);
-
- $this->consumeNewLine();
- $this->consumeNewLine();
-
- try {
- $this->message = $this->consumeTo('-----BEGIN PGP SIGNATURE-----');
- $this->gpgSignature = $this->consumeGPGSignature();
- } catch (RuntimeException $e) {
- $this->message = $this->consumeAll();
- }
- }
-
- protected function consumeGPGSignature()
- {
- $expected = '-----BEGIN PGP SIGNATURE-----';
- $length = strlen($expected);
- $actual = substr($this->content, $this->cursor, $length);
- if ($actual != $expected) {
- return '';
- }
- $this->cursor += $length;
-
- return $this->consumeTo('-----END PGP SIGNATURE-----');
- }
-
- protected function consumeNameEmailDate()
- {
- if (!preg_match('/(([^\n]*) <([^\n]*)> (\d+ [+-]\d{4}))/A', $this->content, $vars, 0, $this->cursor)) {
- throw new RuntimeException('Unable to parse name, email and date');
- }
-
- $this->cursor += strlen($vars[1]);
-
- return [$vars[2], $vars[3], $vars[4]];
- }
-
- protected function parseDate($text)
- {
- $date = \DateTime::createFromFormat('U e O', $text.' UTC');
-
- if (!$date instanceof \DateTime) {
- throw new RuntimeException(sprintf('Unable to convert "%s" to datetime', $text));
- }
-
- return $date;
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/TreeParser.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/TreeParser.php
deleted file mode 100644
index d01f4b281..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Parser/TreeParser.php
+++ /dev/null
@@ -1,39 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Parser;
-
-class TreeParser extends ParserBase
-{
- public $entries = [];
-
- protected function doParse()
- {
- while (!$this->isFinished()) {
- $vars = $this->consumeRegexp('/\d{6}/A');
- $mode = $vars[0];
- $this->consume(' ');
-
- $vars = $this->consumeRegexp('/(blob|tree|commit)/A');
- $type = $vars[0];
- $this->consume(' ');
-
- $hash = $this->consumeHash();
- $this->consume("\t");
-
- $name = $this->consumeTo("\n");
- $this->consumeNewLine();
-
- $this->entries[] = [$mode, $type, $hash, $name];
- }
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/PushReference.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/PushReference.php
deleted file mode 100644
index dea108236..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/PushReference.php
+++ /dev/null
@@ -1,177 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Exception\LogicException;
-
-/**
- * Push reference contains a commit interval. This object aggregates methods
- * for this interval.
- *
- * @author Julien DIDIER
- */
-class PushReference
-{
- const ZERO = '0000000000000000000000000000000000000000';
-
- /**
- * @var Repository
- */
- protected $repository;
- /**
- * @var string
- */
- protected $reference;
-
- /**
- * @var string
- */
- protected $before;
-
- /**
- * @var string
- */
- protected $after;
-
- /**
- * @var bool
- */
- protected $isForce;
-
- public function __construct(Repository $repository, $reference, $before, $after)
- {
- $this->repository = $repository;
- $this->reference = $reference;
- $this->before = $before;
- $this->after = $after;
- $this->isForce = $this->getForce();
- }
-
- /**
- * @return Repository
- */
- public function getRepository()
- {
- return $this->repository;
- }
-
- /**
- * @return string
- */
- public function getReference()
- {
- return $this->reference;
- }
-
- /**
- * @return string
- */
- public function getBefore()
- {
- return $this->before;
- }
-
- /**
- * @return string
- */
- public function getAfter()
- {
- return $this->after;
- }
-
- /**
- * @return Log
- */
- public function getLog($excludes = [])
- {
- return $this->repository->getLog(array_merge(
- [$this->getRevision()],
- array_map(function ($e) {
- return '^'.$e;
- }, $excludes)
- ));
- }
-
- /**
- * @return string
- */
- public function getRevision()
- {
- if ($this->isDelete()) {
- throw new LogicException('No revision for deletion');
- }
-
- if ($this->isCreate()) {
- return $this->getAfter();
- }
-
- return $this->getBefore().'..'.$this->getAfter();
- }
-
- /**
- * @return bool
- */
- public function isCreate()
- {
- return $this->isZero($this->before);
- }
-
- /**
- * @return bool
- */
- public function isDelete()
- {
- return $this->isZero($this->after);
- }
-
- /**
- * @return bool
- */
- public function isForce()
- {
- return $this->isForce;
- }
-
- /**
- * @return bool
- */
- public function isFastForward()
- {
- return !$this->isDelete() && !$this->isCreate() && !$this->isForce();
- }
-
- /**
- * @return bool
- */
- protected function isZero($reference)
- {
- return self::ZERO === $reference;
- }
-
- /**
- * @return bool
- */
- protected function getForce()
- {
- if ($this->isDelete() || $this->isCreate()) {
- return false;
- }
-
- $result = $this->repository->run('merge-base', [
- $this->before,
- $this->after,
- ]);
-
- return $this->before !== trim($result);
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference.php
deleted file mode 100644
index 96b8fa129..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference.php
+++ /dev/null
@@ -1,84 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git;
-
-use Gitonomy\Git\Exception\ProcessException;
-use Gitonomy\Git\Exception\ReferenceNotFoundException;
-
-/**
- * Reference in a Git repository.
- *
- * @author Alexandre Salomé
- * @author Julien DIDIER
- */
-abstract class Reference extends Revision
-{
- protected $commitHash;
-
- public function __construct(Repository $repository, $revision, $commitHash = null)
- {
- $this->repository = $repository;
- $this->revision = $revision;
- $this->commitHash = $commitHash;
- }
-
- /**
- * @return string
- */
- public function getFullname()
- {
- return $this->revision;
- }
-
- /**
- * @return void
- */
- public function delete()
- {
- $this->repository->getReferences()->delete($this->getFullname());
- }
-
- /**
- * @return string
- */
- public function getCommitHash()
- {
- if (null !== $this->commitHash) {
- return $this->commitHash;
- }
-
- try {
- $result = $this->repository->run('rev-parse', ['--verify', $this->revision]);
- } catch (ProcessException $e) {
- throw new ReferenceNotFoundException(sprintf('Can not find revision "%s"', $this->revision));
- }
-
- return $this->commitHash = trim($result);
- }
-
- /**
- * @return Commit Commit associated to the reference.
- */
- public function getCommit()
- {
- return $this->repository->getCommit($this->getCommitHash());
- }
-
- /**
- * @return Commit
- */
- public function getLastModification($path = null)
- {
- return $this->getCommit()->getLastModification($path);
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Branch.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Branch.php
deleted file mode 100644
index 0f263a76d..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Branch.php
+++ /dev/null
@@ -1,62 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Reference;
-
-use Gitonomy\Git\Exception\RuntimeException;
-use Gitonomy\Git\Reference;
-
-/**
- * Representation of a branch reference.
- *
- * @author Alexandre Salomé
- */
-class Branch extends Reference
-{
- private $local = null;
-
- public function getName()
- {
- $fullname = $this->getFullname();
-
- if (preg_match('#^refs/heads/(?.*)$#', $fullname, $vars)) {
- return $vars['name'];
- }
-
- if (preg_match('#^refs/remotes/(?[^/]*)/(?.*)$#', $fullname, $vars)) {
- return $vars['remote'].'/'.$vars['name'];
- }
-
- throw new RuntimeException(sprintf('Cannot extract branch name from "%s"', $fullname));
- }
-
- public function isRemote()
- {
- $this->detectBranchType();
-
- return !$this->local;
- }
-
- public function isLocal()
- {
- $this->detectBranchType();
-
- return $this->local;
- }
-
- private function detectBranchType()
- {
- if (null === $this->local) {
- $this->local = !preg_match('#^refs/remotes/(?[^/]*)/(?.*)$#', $this->getFullname());
- }
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Stash.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Stash.php
deleted file mode 100644
index 9f26802fb..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Stash.php
+++ /dev/null
@@ -1,26 +0,0 @@
-
- * (c) Julien DIDIER
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
-
-namespace Gitonomy\Git\Reference;
-
-use Gitonomy\Git\Reference;
-
-/**
- * @author Alexandre Salomé
- */
-class Stash extends Reference
-{
- public function getName()
- {
- return 'stash';
- }
-}
diff --git a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Tag.php b/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Tag.php
deleted file mode 100644
index bca6ca49b..000000000
--- a/vendor/gitonomy/gitlib/src/Gitonomy/Git/Reference/Tag.php
+++ /dev/null
@@ -1,216 +0,0 @@
-
- * (c) Julien DIDIER